{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This example concerns a laser phase noise channel (+ AWGN), as studied in optical communication systems (https://ieeexplore.ieee.org/document/4814758). A recurrent neural network is used to estimate the phase noise in parallel to the end-to-end auto encoder. The learned constellation becomes eye shaped instead of round in order to have better properties regarding the phase noise. The recurrent neural network can be seen as a spatial transformer network [https://arxiv.org/abs/1506.02025, https://arxiv.org/abs/1605.00716]. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import tensorflow as tf\n",
    "import scipy.io\n",
    "\n",
    "import os, re\n",
    "\n",
    "import claude.utils as cu\n",
    "import claude.claudeflow.autoencoder as ae\n",
    "import claude.claudeflow.helper as cfh\n",
    "import claude.claudeflow.training as cft\n",
    "\n",
    "from tensorflow.keras.layers import RNN, GRUCell, Dense"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "seed = 42\n",
    "tf.set_random_seed(seed)\n",
    "np.random.seed(seed)\n",
    "\n",
    "# Parameters\n",
    "# Channel Parameters\n",
    "chParam = cu.AttrDict()\n",
    "chParam.M = 64\n",
    "if chParam.M == 16:\n",
    "    chParam.SNR_db = 12.5\n",
    "    chParam.ph_noise_factor = 1.4e-4\n",
    "else:\n",
    "    chParam.SNR_db = 20\n",
    "    chParam.ph_noise_factor = 1e-4    \n",
    "\n",
    "# Auto-Encoder Parameters\n",
    "aeParam = cu.AttrDict()\n",
    "aeParam.constellationDim   = 2\n",
    "aeParam.constellationOrder = chParam.M\n",
    "aeParam.time_steps         = 256\n",
    "aeParam.nLayers            = 2\n",
    "aeParam.nHidden            = 32\n",
    "aeParam.rnnLayers          = [24, 24]\n",
    "aeParam.rnnBidirectional   = False\n",
    "aeParam.activation         = tf.nn.relu\n",
    "aeParam.dtype              = tf.float32\n",
    "aeParam.cpx_dtype          = tf.complex64\n",
    "\n",
    "# Training Parameters\n",
    "trainingParam = cu.AttrDict()\n",
    "trainingParam.nBatches      = 4\n",
    "trainingParam.batchSize     = 4*chParam.M\n",
    "trainingParam.learningRate  = 0.001\n",
    "trainingParam.displayStep   = 25\n",
    "trainingParam.path          = 'results_AWGN_phase_end2end'\n",
    "trainingParam.filename      = 'M{}'.format(chParam.M)\n",
    "trainingParam.lambdaPh      = [20, 120]\n",
    "trainingParam.iterations    = 500\n",
    "\n",
    "# TF constants\n",
    "one = tf.constant(1, aeParam.dtype)\n",
    "\n",
    "zeroOneCpx = tf.constant(0+1j, aeParam.cpx_dtype)\n",
    "twoZeroCpx = tf.constant(2, aeParam.cpx_dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: Logging before flag parsing goes to stderr.\n",
      "W1217 21:30:28.115092 140233784268608 deprecation.py:506] From /home/rasmus/.conda/envs/claudeOnline/lib/python3.6/site-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Call initializer instance with the dtype argument instead of passing it to the constructor\n"
     ]
    }
   ],
   "source": [
    "# Tx Graph     \n",
    "X = tf.placeholder(aeParam.dtype, shape=(None, aeParam.time_steps, chParam.M))\n",
    "enc, enc_seed = ae.encoder(X, aeParam, toComplex=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Phase noise    \n",
    "simga2_ph = tf.constant(2 * np.pi * chParam.ph_noise_factor, aeParam.dtype)\n",
    "noise_ph = tf.random_normal(shape=[tf.shape(enc)[0], aeParam.time_steps], dtype=aeParam.dtype)\n",
    "noise_ph = tf.math.sqrt(simga2_ph) * noise_ph\n",
    "noise_ph = tf.cast(tf.math.cumsum(noise_ph, axis=1), aeParam.cpx_dtype)\n",
    "\n",
    "# AWGN Channel\n",
    "SNR_db = tf.constant(chParam.SNR_db, dtype=aeParam.dtype)\n",
    "sigma2 = one / cfh.dB2lin(SNR_db, 'dB')\n",
    "noise_cpx = tf.complex(tf.random_normal(shape=tf.shape(enc), dtype=aeParam.dtype),\n",
    "                       tf.random_normal(shape=tf.shape(enc), dtype=aeParam.dtype))\n",
    "noise = tf.cast(tf.sqrt(sigma2), aeParam.cpx_dtype)\\\n",
    "        *tf.rsqrt(twoZeroCpx)*noise_cpx\n",
    "\n",
    "# All the channel\n",
    "channel_out = tf.exp(zeroOneCpx * noise_ph) * enc + noise"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# RNN for phase noise\n",
    "rnnLayer = cfh.complex2real(channel_out)\n",
    "\n",
    "if aeParam.rnnBidirectional:\n",
    "    rnnLayerFw = RNN(GRUCell(aeParam.rnnLayers[0]), go_backwards=False, return_sequences=True)(rnnLayer)\n",
    "    rnnLayerBw = RNN(GRUCell(aeParam.rnnLayers[0]), go_backwards=True, return_sequences=True)(rnnLayer)\n",
    "    rnnLayer = tf.concat((rnnLayerFw,rnnLayerBw), axis=-1)\n",
    "\n",
    "    cells = [GRUCell(n) for n in aeParam.rnnLayers[1:]]    \n",
    "else:\n",
    "    cells = [GRUCell(n) for n in aeParam.rnnLayers]\n",
    "    \n",
    "rnnOutput = RNN(cells, return_sequences=True)(rnnLayer)\n",
    "time_distributed = Dense(1)(rnnOutput)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# compensate for phase noise\n",
    "est_noise_ph = tf.squeeze(tf.cast(time_distributed, aeParam.cpx_dtype),-1)\n",
    "loss_ph = tf.reduce_mean(tf.square(tf.abs(est_noise_ph - noise_ph)))\n",
    "channel_ph = channel_out * tf.exp(-zeroOneCpx * est_noise_ph)\n",
    "\n",
    "# feed phase noise compensated signal into decoder NN\n",
    "dec = ae.decoder(channel_ph, aeParam, fromComplex=True)\n",
    "per_ex_loss = tf.nn.softmax_cross_entropy_with_logits_v2(labels=X,logits=dec)\n",
    "softmax = tf.nn.softmax(dec)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "W1217 21:30:30.129920 140233784268608 deprecation.py:323] From /home/rasmus/.conda/envs/claudeOnline/lib/python3.6/site-packages/tensorflow/python/ops/math_grad.py:1250: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.where in 2.0, which has the same broadcast rule as np.where\n"
     ]
    }
   ],
   "source": [
    "# Neural Network MI, with -> softmax = P(x|y)\n",
    "Px = tf.constant( 1/chParam.M, aeParam.dtype )\n",
    "softmax_MI = cfh.softmaxMI(softmax, X, Px)\n",
    "\n",
    "# Loss\n",
    "correct_prediction = tf.equal(tf.argmax(X,-1), tf.argmax(dec,-1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_prediction, aeParam.dtype))\n",
    "\n",
    "# use this hyperparameter to make loss on phase noise less important\n",
    "# the longer training goes on, this helps the RNN in the beginning of\n",
    "# training to figure things out\n",
    "lambda_ph = tf.placeholder(aeParam.dtype, ())\n",
    "loss = tf.reduce_mean(per_ex_loss) + lambda_ph * loss_ph\n",
    "\n",
    "optimizer = tf.train.AdamOptimizer(learning_rate=trainingParam.learningRate).minimize(loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "W1217 21:30:32.962642 140233784268608 lazy_loader.py:50] \n",
      "The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
      "For more information, please see:\n",
      "  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
      "  * https://github.com/tensorflow/addons\n",
      "  * https://github.com/tensorflow/io (for I/O related ops)\n",
      "If you depend on functionality not listed there, please file an issue.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "metricsDict = {'xentropy':loss, 'accuracy_metric':accuracy, 'softmax_MI':softmax_MI}\n",
    "meanMetricOpsDict, updateOps, resetOps = cft.create_mean_metrics(metricsDict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "init = tf.global_variables_initializer()\n",
    "sess = tf.Session()\n",
    "sess.run(init)\n",
    "\n",
    "saver = tf.train.Saver()\n",
    "checkpoint_path = os.path.join(trainingParam.path,'checkpoint',trainingParam.filename,'best')\n",
    "if not os.path.exists(checkpoint_path):\n",
    "    os.makedirs(checkpoint_path)\n",
    "else:\n",
    "    pass\n",
    "#     print(\"Restoring checkpoint...\", flush=True)\n",
    "#     saver.restore(sess=sess,save_path=checkpoint_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoche: 25 - avgLoss: 3.285382032394409 - avgMI: 1.2776559591293335 - avgAcc: 0.09432220458984375\n",
      "epoche: 50 - avgLoss: 2.3536911010742188 - avgMI: 2.6055030822753906 - avgAcc: 0.2622642517089844\n",
      "epoche: 75 - avgLoss: 1.7968099117279053 - avgMI: 3.408278226852417 - avgAcc: 0.4619789123535156\n",
      "epoche: 100 - avgLoss: 1.3884820938110352 - avgMI: 3.997159242630005 - avgAcc: 0.6021385192871094\n",
      "epoche: 125 - avgLoss: 1.1168159246444702 - avgMI: 4.388981342315674 - avgAcc: 0.6855278015136719\n",
      "epoche: 150 - avgLoss: 0.9503926634788513 - avgMI: 4.629037380218506 - avgAcc: 0.7213516235351562\n",
      "epoche: 175 - avgLoss: 0.8301262259483337 - avgMI: 4.802509784698486 - avgAcc: 0.7477531433105469\n",
      "epoche: 200 - avgLoss: 0.753707766532898 - avgMI: 4.912739276885986 - avgAcc: 0.7683906555175781\n",
      "epoche: 225 - avgLoss: 0.7028890252113342 - avgMI: 4.986040115356445 - avgAcc: 0.7819023132324219\n",
      "epoche: 250 - avgLoss: 0.652906060218811 - avgMI: 5.058139801025391 - avgAcc: 0.792510986328125\n",
      "epoche: 275 - avgLoss: 0.6054105758666992 - avgMI: 5.126650810241699 - avgAcc: 0.8050384521484375\n",
      "epoche: 300 - avgLoss: 0.5820533037185669 - avgMI: 5.16034460067749 - avgAcc: 0.8106040954589844\n",
      "epoche: 325 - avgLoss: 0.5578039884567261 - avgMI: 5.195323944091797 - avgAcc: 0.8191566467285156\n",
      "epoche: 350 - avgLoss: 0.5337561368942261 - avgMI: 5.230011940002441 - avgAcc: 0.8235244750976562\n",
      "epoche: 375 - avgLoss: 0.5094212293624878 - avgMI: 5.265117645263672 - avgAcc: 0.8321380615234375\n",
      "epoche: 400 - avgLoss: 0.49320703744888306 - avgMI: 5.288503646850586 - avgAcc: 0.8352203369140625\n",
      "epoche: 425 - avgLoss: 0.4764300584793091 - avgMI: 5.312705993652344 - avgAcc: 0.8403968811035156\n",
      "epoche: 450 - avgLoss: 0.46274664998054504 - avgMI: 5.332444190979004 - avgAcc: 0.84454345703125\n",
      "epoche: 475 - avgLoss: 0.46426817774772644 - avgMI: 5.3302483558654785 - avgAcc: 0.8422775268554688\n",
      "epoche: 500 - avgLoss: 0.44114407896995544 - avgMI: 5.363603591918945 - avgAcc: 0.8490753173828125\n"
     ]
    }
   ],
   "source": [
    "bestLoss = 10000\n",
    "for epoche in range(1, trainingParam.iterations+1):\n",
    "    sess.run(resetOps)\n",
    "    \n",
    "    # help RNN to get phase noise right in\n",
    "    # the beginning of training\n",
    "    if epoche < trainingParam.lambdaPh[0] + 1:\n",
    "        lambdaPh = 1\n",
    "    elif epoche >= trainingParam.lambdaPh[0] + 1:\n",
    "        lambdaPh = 1/(epoche-trainingParam.lambdaPh[0])\n",
    "    elif epoche > trainingParam.lambdaPh[1]:\n",
    "        lambdaPh = 0\n",
    "        \n",
    "    for batch in range(0, trainingParam.nBatches):\n",
    "        data, _, _ = cu.hotOnes((trainingParam.batchSize,aeParam.time_steps),(1,2,0),chParam.M)\n",
    "        feedDict = {X: data, lambda_ph: lambdaPh}\n",
    "        sess.run([optimizer, updateOps], feed_dict=feedDict)\n",
    "\n",
    "    [outAvgLoss, outAvgAccuracy, outSoftmaxMI] = sess.run([meanMetricOpsDict['xentropy'],\n",
    "                                             meanMetricOpsDict['accuracy_metric'],\n",
    "                                             meanMetricOpsDict['softmax_MI']], feed_dict=feedDict)\n",
    "    \n",
    "    if epoche%trainingParam.displayStep == 0:\n",
    "        print('epoche: {} - avgLoss: {} - avgMI: {} - avgAcc: {}'.format(epoche,outAvgLoss,outSoftmaxMI,outAvgAccuracy))\n",
    "        \n",
    "    if outAvgLoss < bestLoss:\n",
    "        bestLoss = outAvgLoss\n",
    "        lastImprovement = epoche\n",
    "        saver.save(sess=sess,save_path=checkpoint_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "[outNoise_ph, outEst_noise_ph] = sess.run([noise_ph,est_noise_ph], feed_dict=feedDict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/rasmus/.conda/envs/claudeOnline/lib/python3.6/site-packages/numpy/core/numeric.py:492: ComplexWarning: Casting complex values to real discards the imaginary part\n",
      "  return array(a, dtype, copy=False, order=order)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f8a5c669710>]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD8CAYAAACfF6SlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzsvXeYJFd5NX5uhc49eTaHWe2uckBoJaGABBbIAoxkDLKJJtk4YYP9fb/fZxsbE0ywsY3xB8Im2NjkaCSMEkICCaG0ylpt0Oad3Z3cM9O5u7rq++O9t+6t6uows92bps7z7NO91dXVNVX3njr3vO99L3McByFChAgRYmlBO9EnECJEiBAhjj9C8g8RIkSIJYiQ/EOECBFiCSIk/xAhQoRYggjJP0SIECGWIELyDxEiRIgliJD8Q4QIEWIJIiT/ECFChFiCCMk/RIgQIZYgjBN9Ao0wNDTkjIyMnOjTCBEiRIhTCo8//viU4zjDrfY7acl/ZGQEW7duPdGnESJEiBCnFBhjB9rZL7R9QoQIEWIJIiT/ECFChFiCCMk/RIgQIZYgQvIPESJEiCWIkPxDhAgRYgkiJP8QIUKEWIIIyT9EiBAhliBC8g/RHLOHgJ13nOizCBEiRIcRkn+I5njos8C33waEaz2HCHFaIST/EM2ROQDYVaCSO9FnEiJEiA4iJP8QzTF3iF5Lcyf2PEKECNFRhOQfojlmQ/IPEeJ0REj+IRqjOAuU5+T7ECFCnDYIyT9EYwjLBwiVf4gQpxlC8g/RGLMh+YcIcboiJP8QjREq/xAhTluE5B+iMWYPAnqU3pdCzz9EiNMJIfmHINQsID/l3TZ7EOhbB0TSofIPEeI0Q0j+IQjffxfwqY2AbcttgvxjvSH5n2gcfRrYfc+JPosQpxFC8g9BeP5WerVKcltmHzCwAYj3heR/onHvx4Af/uGJPosQpxFC8g8B2DX5vlqg12KGCL9/hJR/mOd/YjF7AMiNA/npE30mIU4ThOQfApjYLt8L8s/sp9f+DaHtc6LhOGTBAcDk9ub7hgjRJkLyDwGMPirfV/zkPxKS/4lGflI+lJ/5NvCPZ8v7EyLEIhGSfwhg9HH5XpDMzD567V8PxELP/4Qic0C+f+KrQPYocOjRxvuHCNEGQvIPQcpSQLV9ksNANE3KvzznjQ2EOH6Y5eQfHwDA11WY2nXCTifE6YGQ/EMAtiXfq7ZP/wi9j/XSa3n+eJ5VCAFh8Wy+nm9gwOTOE3U2IU4ThOS/1DCxHbjv496VuZwaEO2h99UA8o/30WuY8XN8sO9+4EuvBGpV+v/sARqFXXAzsP5qYOOvAFMvnNhzDHHKIyT/pYZbXgL8/O+8K3PZNbJ3AEn+hRkguYze96ym18y+43eeSxmHHqUgvHjYZg4AfeuBza8A3vljYMX5wMwempUdIsQiEZL/UoJavkHYOwDZPir5Ow49HCJJ2rbiAnode/b4nOdSRzlLr7Uyvc6NAn1r5edDZwK1iowFhAixCITkv5Tw7Pfk+2pevrctaftUCkC1CMCR5J8YAHrWhOR/vCBiKxYn/2IGSAzKz4fOpNfQ+glxDAjJfynh4EPyvUf5q7ZPEajwB4MgfwBYeSFw9Jnun2MIRflXaBRWmqN0W4H+DfQqJn6FCLEIdIT8GWM3MMZ2MsZ2M8b+PODzP2OMPc8Ye4Yx9lPG2PpO/O5SxKGZAhw1WLsQCCUJSG8fIOWvR6h8czUvRwWRlNxnxQXA9Aveh0aI7qCkKP9ylgLycYX8jQi92tXjf24hThscM/kzxnQAnwPwKgDnAngTY+xc325PAtjiOM6FAL4H4O+P9XdPV8wWKvinn+xCza4n+DufG8NL//4+3Pb0kcUdvFaR7yuq7VMDNB0w4z7ln5D7rLgAcGxvKYgQ3YFQ/lZZrqOgKn/NpFeRDbTth8AXf8VbkTVEiBbohPK/DMBux3H2Oo5TAfAtADepOziOc5/jOEIyPgxgTQd+97TE3c+P419++gJ2jHlz6jP5Cv7qh+S5f3fr6OIOXqsAJrdyVOXv1ADNIJunUgi2fYTPPLN3cb8don0Iz79Wlhk/Yq4FAOic/IXyH3sGOPw4UMkev3MMccqjE+S/GoCy3h9G+bZGeDeAOzrwu6clpnOkzrMlbxrfD586jKlcBTectwIP7pnC0bniwg9eq0r7wJ/toxmAmSDLR6SBqraPSzhhemHX4QZ8K1L5q7aPZtCrmHEt7LzCzPE5vxCnBTpB/ixgW6ApzRh7K4AtAD7V4PP3MMa2Msa2Tk5OBu1y2mM6Rx15vkiq7qfbx3HvjnFs3Z/B6r44/uLVZ8NxgNueWoT1UysD8X5678/28dg+/MGgKn+m06sTlnjoOkpByl8hf8bofgjbR9h5xczxO8cQpzyMDhxjFICShIw1AOqYiTH2CgAfAHCt4zhl/+cA4DjOFwB8AQC2bNmyyKjmqY3pPHXkea78P377dsyXLDAALzljEOsHkzhnZQ/u2zmB37t248IOXqtKEvFn+7i2T17aPqbi+Wu63DdE9+A4Xs9fjMJU5Q/Q/RK2j5oSGiJEm+iE8n8MwGbG2AbGWATAGwHcpu7AGLsYwL8BuNFxnIkO/OZpiymu/LOlKkrVGvZN5TGZLWMiW8aWEVLt1545jK37M8iVm1gwY88BP3qfNwhYq0gSqTYL+AbYPqHyPz6oFuQ1rlWClT9ANpyt7AeE5B9iQThm8nccxwLwXgB3AdgO4DuO42xjjH2EMXYj3+1TAFIAvssYe4oxdluDw5282HMv8MA/dv1nhOc/X7SwcywLNennxeuI/K85cwiW7eChPQGrOn37rcBtfwJ8+Xrg8a94K3bWKqTuNaOJ598g4Bsq/+ODshK0Fdk+TJfzMAQ0Q9o+ofIPsQh0wvaB4zi3A7jdt+2DyvtXdOJ3Tiie+wGw48fAS/9XV39mOs89/1LVzfh5yRkD2DGWxdkriAC2rB9AIqLj57sm8Mpzl3sPsP1H3v+Xs8Ctfwhc/acUQNRNyvjx5/kzvZ78VdvHVf5hOmFXUVKyvGoVPsGrl3x+FartI5S/P+BrVSh4nBzq3vmGOGXREfJfErAtXvage3AcR8n2qWL70SySER1fevulyOQrMHQaqEUMDRes7sWOo22k9s0dBHbfA2fdlWC1Ck3kiiQC8vwNvr1AlpCZBDRlYCjeh8q/u1DLZls84Ov3+wFu+3Dbr5Ht8+23Ai/cBXwoXIgnRD3C8g7tolYFrGJXJ9LMFy1Y3OeZL1p4/ug8zlqRRipqYO1AwrPv6r44js6VWh80Ow4A+OJ921Eql2gmr5lAqaA8OBzh+SfkJK+I9/fANLlviO5BJf8at338fj9AE71EVU/X9pkBnvy6jBO8cFd3zzXEKY2Q/NuFm1nRPfU/lZdJUPOlKnaOZXHOyp7AfVf0xjA+X/LOBA56MOXGAAC1aolIQjeRRxQPPH8QW/dzm8BN9eR5/uWc1+8HQtvneKHUpvLX9Hrb5+DDZPE9933vvostBxLitEZI/u1C2B3C+pne03EbSFg+UUPD4dki5opVjAwmA/dd2ReHZTtudhCdW33dHWf+KB0TVURYDdAjmK9FkEAZP3jyMO0kAr6RBJF7ccab6QOEAd/jhaCAb5DyV20fofxFieeCLxHgeN2zmb0yCB3ipEdI/u1CNOpqgTrbv15N2TQdhJjgNTKYxIFpIvJVffHAfVf1xgAAR2aVB5Dw8S//A+DGz9LpztGUizjK0GADRhRzlokEK+PO58ZQrdnebB+AMoQaKv+Q/LuKsi/g21D5m/WTvAT8gd/jMSu7MAN87nLg6W91/7dCdAQh+bcLMcSuFIDsGD0EOjydfopP8NowJIl3dX8w+a/g5D+m+v4iP3/VxcBZr6bTnifbJ8X4Q0I3MV0xkGRlzOQr+OVungrqIf8pb6YPoCj/0PbpKoTyj/U1V/6aXq/8BYongPxn9tFDaGZP938rREcQkn+7UJV/joKonS6pK5T/+iFJvKsbKn/afsRD/kp+PlfuLEvkP2TQsWvMxFRZx1CUCOH5UU4UTGuh/MOA73FBaZ4sNzNB2Tu25S3qJuDJ9vGTf8ZrSR4P8p/dT688wSDEyY+Q/NuF6vlzQu20v3lktoihVBT9CarXHjU0DKUigfv2JUycYU7DGH1YblTJ34gCTIdRpAnV/Zz8Z0oO8nYECVTQEzMwNc+/oxlAjAeXa5V6z58xegCEnn93Uebkb0Skd++f4AV4bR8rwPZRl+w8HvdMLCzDEwxCnPwI8/zbhVD5HvKvNN5/ETg4U8D6wQR6YlRBc3VfHMw/uYeDMYZvGR/Csh3TQO1mQDe85M8YEElBL1OOd69GSvBwzkYBUZh2Ect7Ypic50FizZBr9Ypj1P2oHir/bsMqA2aM5mMIWzGQ/A2v8o+kqaSzHiHbR53ZfVyUPyf/UPmfMgiVf7twbZ+8VDcdJv9DM0WsG0igJ07P5EbBXoFlDleGk3yBFbcmT9L7CiABsocOzVkoIArNKmJFTxRTKvn3rKK1en3fdaHpofLvNkTwXVX+/lEYQA97l/yrtMymHgE2XEsPDTXj53iQf4ZnGoXK/5RBSP7tQnSgalGqm1rnOlXFsnFkroi1AwmkFeXfDGPREQDA/qd/zg/iq8kTlaQRr9GDYSJvw9YTYHCwOsWQyQry5wHdNZd4j6GC6WGef7dhW2Tp6FGgwK2baAD5e2yfMrD2cuAvjwCrX0wlIbJj3mN2G0L5F6brbagQJyVC8m8XLvkXuqL8D88W4Tgg5R8j5d8o00egZ2gVAGDXL29F+a4PAfO8krZQigqBmxY9GMbytjt7d03KRibHA4OC/Jdz66fkXUkMAHn+Ifl3F67yj8r2FaT8RW0f26ZXI0pB4PgAAAeY3i337bZV5zjA3CEZmM6HhXtPBYTk3y5qqucvlH/nyP/gDCnw9YMJLOuJgTFg43BAp1eQAAVxr2ePIvrQp4Ft/00fuLaP/D4DkfbhrA2dK8mVCVvaOGJ1qFUvotdyAPlrYcC36xCzrXUl0B/k+esG3QvRBsVKa2KxnqldyjG7fM9y44BVAtZcSv8Pff9TAiH5B+HwE8AXXuadbenJ86dZs53M9hHkv24ggdV9cdz5vmvwqvNXNP+SWpwNoKE30wCD5gAEWTfzVQYjTtuXx2wYjCt5Qf4brwNe+VHgug/WfTcM+B4H2BYRuRGV2wKVP7d9RJqnzvdPDNCrh/wXafu0WxZCWD5rLqPX0Pc/JbB0yX/2ELDzzuDPDvwSOPIkMLlTbhP+fnlOerEdzPM/OJ1H1NAwnKJOfNaKNDQtONPHRaWAzOqX4S+q74bDNMr2iKRk+d8A8q86BiJxUpLLoxZ0cDIXM3g1DbjqT4DUsvrfCwO+3YewfTzKv4ntI/x18bCIc/JXbZ9G5O84wPO31k8SA+jB8uE+4P7AFVe9mOdlQlbzeFE2JP9TAUuX/B/9AvDddwR/JpSLqJUCSKLPKNs6aPscmC5g7UCiNeGrqORg967DN2vXoRTjZK0SfoBirEKH1bseALCsvB+GIH/h+TdDqPy7j5rw/GNymxkQfBcrebnKnz8sEv1yn/4Rem1E/vsfAL7z28DOO+o/m9lHr1u/0vqcBdmvuAAAk5MgQ5zUWLrkX5qjCp1BQ1vhWc4ekttEB8rsk9s6YPtULLJdto/NY/Oy5h5/HaoFmDFS8cXoMG1rQf5lmLAHNgOxPqQnn4DB+N+vtTHlQ9PD8g7dhprqCdA91AK6qcYXcBeq3a/8AeC83+DHbPDA3nMvveYCArRTfNTbv15uy44DX78Z+OlHvaVNsmNkQ6WWAanlwJGnlL/HBu75MLDj9rC66EmGpUv+Iic+aMjrKv+DcpuwfYQiivUdM/k/eTCDCz98F7728AEcminiorUBNVwawa4BVglGnAg+Zw7SdoX8q3p9tlAVBgZTMWDtZdAOPYLBhLB7QuV/UsC1fTiZR1L40G3b8PVHDnj300wajboBX/6wUEtBrL9KHlNg111ExIAkf38VUEBanr1r5banvga8cDfwwD8AT31dbs+OAekVZDde9ru0jsCz36PPMvuAX/wT8K030Wg7xEmDpUv+ZU7+/roogBzGquTvBnz59/rWLs72eeK/gPs/hdlCBe/9xpMoVW18+icUnLtozQLInwd7hX8/pwvyl2q/yMg6qGmmu60KA/3JCOWFT+3EKoP/PW0p/zDbp+uwqzLVEwCiKXz/iVHcvc1npYjaPn7lL+I9G66VoweV/L/xm0TEmQPA0WdoWxD5i4Cx2i6e/Z7M6FHXgM6NkeIHgKveD6x6MfDTj5DSV1cXm3i+9d8f4rhh6ZH/+DaqeyIyeYKUv7B95hTbx6PyGdCzenHK/6lvAvf/Iz5265MYny/hspEBTOcrYAy4YE1AAa9G4ORvxJKIGhoyOh/uK8o/5xD5V6PSCqjCwIAgfwAXYwd90A75h8q/+7BrlMbJlXzNTCFbsjCR9bVTzaDRqGiDupId9JdHgLd+X97TIM//W28B4NA+zZS/WLxofBuR94W/RaMOSykoKJQ/QOd+8VspXja500v+oXA4qbD0yP/zVwK3XEGZMUA9+VeLlNHDNFL+jsP/KQ03OQSY8cUp//nDgFXE+LM/xR++fBN+/2VnAAA2DaeQii6g1JJYuCWSQjpmYIrVk3/WJkKoxQbdbWWHk/+ycwEAIw7P1GjL9gkneXUd6iQvACWNJuRNZn1LdopsHzFyNZTsoEiSRgZ+8rdrsjrr+LPAi3+bVHrd4i82MPUCva/y3933AL2e/RoKRqv9JjsGpFfK/2++nl5fuMsbGwjJ/6TC0iN/gGYguraPj8CF5bP8PFmz36+cUitImS001dO23TkCrzCewXtfvglXbhxCIqLj4nULsHwAaT+ZCaSiBiYc/n2F/DMWEQJLDbnbXOXPySXBeCdmbZB/mOrZfdSqnlTPAihuM52voGLZKFb49ffbPqryFxD3VNyz/BQ9vC/7PeCmW4DX/gsJGT/5zx+mGlaAVPiivcUHqO2IEUG1SGsOpJfL7/etBZadB+y6Wyr/WO/xKTMRom0sTfIHlICvT1GJNDXhbc4eqLd30su9tVX8+O/fBx7/T/e/xUoNW/72HvzsqR3uw+bl+tOIGBpipo7v/N4V+MuL8jIA19b5C+WfRDpmYqzGLSPF85+qkNdvpofdbbZmUvkITi4x8Idf27ZPqPy7CrtGbYs/nOcdenUc4Jaf7cYVn/wpPQA0g+6FaL9GQOlvMZrLHgU+1As8/Dn6/8jVwMVvofhAYqCe/DP75XtxfKsEgNF5qcpfiCVV+QPApuuAgw/xUg8MSAyG5H+SYemSf7lBto9ozGK24uyBeoWfXkHKq1ahZevu+oD8bGYv8PQ3gR/9ibtpKlfGVK6MfXvJR91lnIW1zhE37nD+yhT6fvS7wFdfB/zi0+2dv1LELRU1cNglf6n8n2Nn4nvOy2FuvNbdlownqEw0LwcQ4yUiwoDvSQK3vAOR/lxNKvo7nh3DbKGKFyay8n4JEaAHkT/fR6QsP/gZek0rM8cTg0T+ahqmqBHVt04uClMtEukz/gAQDwUhllK+2eiDG8kqndhBql+PhuR/kmHpkr8YtgryH3uWLB7RmNe9hF6n99QTnrB9ahVKnXvu+/KzZ75Lr6sudjflK9ToKzPUCbc6Z9MHolPuvgeYH6Vyyj/7u/bOvyrJPx0zcLiSpN9c+SJ3l9GCjs+m3ueZrXvOGu7/MwboUcR4qecw4HuSwM32ITKfrkbcBJ6d4yQWdhzNylo+YgQbZPu499SXX+8h/yFqx+I4AJDl5D9whlf5m3zimUf5H60/JgCkqeggxp+jekOaEQqHkwxLi/yDJpmIgNm/Xg188eXUmDUD6FtPJD+zV9o7Ub7Slav8LeoUQh05DvDMt+l9UhJuvswVD1dUD5Q20v9FNtHjX6H9L3h9vQ3VCEL5mwmkYgbmyg7wnp8B597o7jKRLWNZOiZVoWbi3995mTyGHkHUFuTfRlMIPf/uw5fnP1E2sclX4G/72LwkdhH4D7R9xD6+NpVS/PkEFwOq9TN/lBaHSQzJ9lgtAQafNyKUf25C5vP7yb+H20CzBzj566HyP8mwxMg/wK9Wa49n9hNBp1cSGQ5uRGl8F546wFdFEuSfWi5tn2pRkn9hRi5grVhFuTIRZiQ/Bkcz8ESNMnzceQQHHgTOfjVfQ9dpj2AV2ycdNZAr13esqWwZw+moLBXgtwaMCCLOAmyfUPl3H3bNU9htrGTiorV9UBd02350nuICgGwHgcqfe/5VJSc/3u8tGhdE/tkjtLCPGZMPDqtYr/zv/isqDfGSP5LHEehZrfzGAI9RNGg7pfngEuIhuoqlRf5BysMqeUcEswdJ9QOw+89A/sgu/PHXH6XPRGndtJLtY5Vo9GDXZME3wBMMFsq/15pEJb4cE+iDrZkylbScpc4jCLid+QMq+cdM5MoWHN/IZqKO/E3vMfQoTK78q06o/E8KCM+fE/R42cD6gQQGk/TgHhlMYMdYFo7r+XO7ppnyV0eTfm/eJX8lJXP+KCl3I65k9SjK34zRMYuzwIrzgRs+DviXG433ywdSK+X/vXcBn1xLcwnaRbXoPecQC8YSI/8A4qpVvCOC2UMU6AKQTa7DIJvDAOMdTJTLTa+UROpOFit5F82uqcqfGv1KzGBaH4IDDdXUaiJ/q0S/H0nJY7aTQuoO9+NIxQzUbAfFqvz7ChULubKFZT1RqfQMnzo0Ii75l2ptFJQLs326DzfVk+5V3onjwrV9ZN8BeO1FqzBbqGK+wh/0bsC3ieevKn81JROQbVptu9mj5NkbUentW0Wa2wJw5V+i4wYVnQPoYSCsn/hAc8//0CP0+l83yVF0K9z1AbJq/ZZWiLaxxMi/gfJXlfb8YcpTBjBh0uurVtCQNHfW64E3/Ad9LiwUMVytFuXQObXCM39AKP8VbBqjFuXjs7515PmLrKNoWg7l2/FGK3nqeJrmTg7LleT3Juap0y5LxyTp+20fPQKND8XL7ZC/xid5vXAPsPunrfcPsXCIZRy5ki+yOLas78eynih64yYu30BKfSLPH8KuCGhG/gpB+lMy/baPXaOMt56VRPZVXvywWlLInz8UKnl3VbhACOunlfLvXUP75CeBZ77T+HgqDm+lvvrU19rbP0Qdlhb5B3mOVtnXKB1X+R8ADZGv6iHPf7QcB87nlRIFUZfn6LValLZPz8o624fBxio2jefyvTA0BnNwPY0yxExjVfm3szaw0vHSfNnHz/98Dw5OExlM5gT5K8o/wPYRKLal/Hmq5wP/0H5Kaoj2YdtwSy6s3oJb469DedXlSEYNvOmydfiT6zbTBD0AedFEKjkakQXN0PZ7/pE0sO4K7z6xXrqvYjJWfpL6SXoltwsdEjJWUdqHrvJXRgNBEA8a4fk3Iv9qEdj0SmD5+cAj/9q4+qdtA39/BvDL/yvLTzz4mbDS7CKxtMi/ke3jt1k4+e+q0MzYTYyydA7OKvv5bR+/8vcFfNfos4gyC3usISzviYH1racJMGK4HUnKztqO7VPJuzn9gvz/48H9+Nx9tIiHUP6tAr4CRatd24cvHdjBtQxCcIj7runI2ib+bO43cfGmNQCAXz1vBd599Qb0J6ndZcXlrxSCVT9Q7/m/+27gkrd792FMVggF5MIsPatku7FKXPkL8o/S/6v5xrYPoNg+/a3J34wBl76b6gepiyipqGSpj939V3ROyy8g61StHxSibXSE/BljNzDGdjLGdjPG/jzg82sYY08wxizG2Bs68ZuLQkPbx7ddKP95B0VEEbdI3R+YVQhPEKnwwK0ikJ8mdRVN1dk+myMUnKqk1uKV5y53rSVMbKfXaEqOJtoJ+Cp+azIiM3VMg0h8fJ46vFf519s+AsVaG7XWRcDXtto7xxALg2ifuoltR+ZRsx1sGen37NKfoHuWFZe/kg+e4AUoyp+Tf8P9FD9+XuTtr5RkXy1x5a96/mV68DSzfUSuf6s8f3FssRLY5I7g/fwZQWK96Q6uqLeUcMzkzxjTAXwOwKsAnAvgTYyxc327HQTwDgDfONbfOyYENT6r4n0oMM31Kg/PFlFlUVfd788EkL+AsH2Sg97SD9t+iLe88H5copMi/9Tv3ogP3XienHglptJH0krAtx3bJ+cq/wvW9OLNl69D1NAwW6DfHc0UETd1sgn0Nsh/QcrfCnO2uwFxTTXDfXiv6ffaKjFTR8zUFOWfa07qgMzY0aVIqFg2frl7Su4nfjvP05pTyyXZW8V65e/aPk3IXwic5HDzTDERTxjcDIA1If855T8MWHEhvQ2FyKLQCeV/GYDdjuPsdRynAuBbAG5Sd3AcZ7/jOM8AOLHmnEpYGq96aJW8yiG9yiXh0UwBlh5zFceBTEWmU/r887ue2ktD0sQgnwNQBZ6/Dfju23F2/jG8vnYnACY7RJwrurlReo2mmpfg9UNRXYmIgY+/7gKct6oHmQKxwqFMAWsH4lTKoZHyV+yCQjtcLlbyspuQ/6NfBL755jYOFqIONUn+k7yE83AqVrdbfyKCOUH+1TZsH5FBo9z//3nmCN78pUdwaKbgJWZhEZlxeVyr7FP+cUpvrhaak/+ZrwJ+86vAyotIOAS1GdumY5lxas/9I43Jv6wo/4ENQIzPuwmV/6LQCfJfDUApfI9Rvu3kgxrwjaZo+FrzKf9Bmn1r2w6OzJbgGHG30eUt5gZS/eT/3Yd3o5qdpFmRovQDt3RyLIUVzgT3UZXcZ0DO8vUEfNtozJaSd83Rn4ggk6fvHpopYG0/75i8lENdLviClb9G1zDI9jnwENleL9wN7Ly9/ZS9EBKK8p/MlRHRNfTE6yff9ScimCuJVM8mto8o3yzuhbKoz+EMbTs8W/Qqf7dQXFQGc6sByh8A4DS3fXSDZpwz1tjzF6MSEV8YPrve88+OU2C3OMv/Lp1qby1kXky3YNvAZy9tP0vpJEInyD+INRa1WCdj7D2Msa2Msa2Tk5PHeFoBUIedkTR1GtXzv+5vgJuo8uFkroxKzaYOwG0fC7qbTePvcHGU4eSnqUSuUP5WCdAMPG+eRzv1KeuhxngJZqH8I0kl1bONxlyreobxANCXiGC2QKOOL8RKAAAgAElEQVSTQzO0ILwLI9bU9ilYC/H8q95zLGaAr7yGluub2QfAAaZ3y88nd8q/U+Do03KiWgiC7VX+w+kojdx86E+amCvzQXQl31j5C9J1lb8kf7E4zES27CN/sSykkihQLZA6Vz1/gWYBXxWNyL+qjDQAYPgsWktAJfTttwE/+SAwxlcee899wGv/eWFiqVsozdKqZ4efOHHnsEh0gvxHASgLfWINgCOLOZDjOF9wHGeL4zhbhoeHW39hoVAbn1D+VlkS2cAZri0zypWRHuUlF8DJf0aQv1f5x1gFenGa0tp0ZX1VPYqnGS/k1j+i/H4PKTNRQTGaVpRMGx5MrVJH5v0JE5lCFZlCFflKzesXG9EWts8CPH+75j3H/b+g7WPPyBiGUG/VEj0Y/uvXJbEUZ4Ev/grw1IkNAZ10cLN9DEzlKhhKB5N6XyKCWVGMtpxtbr1ohuL5q+RPpDsxX/IGY2tlus+6IQlZKO465Y/mqZ7+8wiMufmU/7Jz6DqItbIBOYt5Zi+99qym312IWOoW3BTZiRN3DotEJ8j/MQCbGWMbGGMRAG8EcFsHjtt5iManR4iIjYjX9lE6x2iGSN6MSWVjMR0HhPLXvOQ/iHnodtlr+1hlwIhgq30m7dSvKH9NI/Xv1Ehl6aZU8m0rfx/5JyMoVmvYPUGdZZ1H+UcD8vzl93Pt9B+Nz/Ct+ZT/3p/R68GH5XaxEtRz36cg4vQLwA9+B7jv49SJbSucnu+H2z5NUv6pYPLvT5jICNsHDhBvshCQUrNpomBjvkT3R8QUJrNl7wQsq1w/I1wQXJDyb2b7eM6jgefvKn9+nKHN9Dr9gtxHjBCned0sUWNrIfNiFoLnb5O/5ThkZzaCuDa5JUj+juNYAN4L4C4A2wF8x3GcbYyxjzDGbgQAxtiljLFRADcD+DfG2AKKeHQQovG97l+B13+ZSFexfWrQ3IDu4VlSJNG4JP/+ZEJR/l7iXa3xBpIcogeDY7s10B+tbsAz/dcDZ73aez7C94/yqo0LSfW0q3VkLtIAnxklpeaxfc65Edj4K95j8L/BdhhK7dg+TJMB31oA+au5/1Nc+T/yeWD4HODsXwOevxX4+d/J/dWyA6c7bBv45WfljO7AfYTto7u2TxD6ExHMlpXciViTtZ+VyV+/9tmHcfnHfoqvP3Kgie2jkj8n+1Iz5b8A2ydokqVoA+LYEV4/S40ZCfKf2UPnJGJX2gLEUruo5IHvvA34Gp/MuetO4B/PkinZfrjKfyr485MYHcnzdxzndsdxznQcZ6PjOB/j2z7oOM5t/P1jjuOscRwn6TjOoOM453XidxcMoawiKVIsRtST6vmZ+/bjT7/9FACyffoTJoyobNzL+1M4MC2qKHrJf4NJjeBj901gr0gJrWTh6BHMlYG7zv4osPJC7/nEfUsvLiTVs4HtAwDPjFJKnIf8b/g4rdmqgnfiGjQUKg3S8FS4to+S7TN/hPz9M14m91t+Pil/q0LrJJx7E5XFeAsv/7vrLnptt3z16YDJ7cDdHwB2/6TxPvyBWmM6ZvKNyb8vEUHFUeI9Tcmf9nM0ExO5CorVGr78wD6F/EteVV4ry9RgQcjNlP+CbJ8G82zUYwf5+ML2KWa8f2s3PP+jPK4gZg1P7aKHy2NfCt5fjF6XqO1z6kAoD6GGRL4yVw5bD2Wx/SgFdw9niljdH/c07pX96Yae/2pGyn/rpIY904L883D0CGwHSAYtzi6Uv1A7qvK//x+a2yIBtk+fovz7E2brBeH592tM9xSFawixkpdK/qKziAeLHgU2XMuDdnQdyjBRcnRgLV9LYJRXSV1KGUHC3qg0Ge3wa5qtALYDDKeCs3j6EyYsKOUc2iJ/el3ZG8PeqTwqFpHbxHzZ68d7lL+P/NWSzgKRdpV/gzx/0QbEsV1CV0aRamKASO8EuuP5H+GBWyHUhJ3z9LfkbH4V4toUZjpvP3UZS4v8eefadjSPB3dPyVRPrhyqju4GwkYzBazpS3jSKVcMpDGVq2DbkTkUat5Lt8yh7KQZpDFd4qqhnIOtUQcOJGK/7SM8/8ntwL0fpVrpjVCr1NXgF1P/908XcM7KnqBveSFsH2hyYfBmUJW/UFuTfDi88TryYgc20L9a2V0V7R/u2YPf/vKjRFLplcqs6CWk/AWZNbC6fvL8ODI5IsK5MllwzWwfS+26bZC/zYnyqk1D7ke9cZPbPo08f0H+3PZRSzoLNAs2e86jgedv+bJ9hKBpSP6q8vclSDx/G3DwkfbOpxEOP06vom/mxknQVHJyoSYVRSHQnPq1kE9yLDHyJ4L76B278JYvPcJTPcvudgs6MoUqKpaNw7P1yv8V563GsnQUr//8L/Hz3bOeQydtGprOOD2YKFDnzWVnUePkn4g0U/7C8xc12nljV5fWmz1EGTMfXw0cebKB7SP//+J13rIAgeDeaQ16e+Qv1JsI+DoOrdGaXkUW1shLSd2L8+Id24aGR/fzTjJ8ljzeUvL8xYpxAaOduWIV7/nqVnzzYcpmmeXioSH5JyOwFNunoKXw6L4Go0Q+yrUZ7X+1Qv7nr+7BXLEKm/nI37V9RLZPM+XfLvk3SvWUpcnd/QDvvir5R5so/++8Dfj36xsXhvMjs1/OGq5VgV13A6OP8WPy/pAdozISKy8CHvty/bHVukKnmPWzxMifGpQlFi7hpWnzReqQfSlqgLvGsyhVbUqVVJTNuuFe/PCPrkLZsvHFh9S8dUqTrDg6soi75Xbn5jKwmFD+AVUXYz7P3786kzrM3Hsf/avkyFJx7ADbR1pRL17fJANEgHdyh+kotGP7uCTBO4BdI+UvCP2NXwdu/L9KWQEiPAs6Vvfxzj2kkn+J8v/v+gDwb9cC/37DKRk4awtipBQw2jmwdyccB9i6l8hDZPIEze4F6m2fO3cX8VtfeEjOQVHBaD+LUdu4eF0f4iZtO28Vqeiq4/P83RnhjbJ91IDvsZK/UP6+4oMe5a+IoHY8/333t3dO//lauWb2ztuBb9wsV9cT55qboFIXl/4OFZ07+JD3GCr5n2IZP0uK/B1+Q21o1AGMKFArY884qfgrz6QSzk8cpBu6us+r/KEZWNUXx0Vr+nBoTmnIvEFmkEZ/IoJclR4GMbuAKu90TT1/sUKYGMaKxq42erUmu3go+OIOUUNHIkId++K17Sh/6sQ201FqV/mLxT0AIorJXZSbDcjVnLjadPi+NWgwdP6ZqvytEvCTvwEe/jz9/+BDwNGnWp/HqQhx3YTS3f8g/d3j23Dhd6/CpWwHShUivP2ZCiKGhuW9TZS/0nWfnLDhOMDXHz1QvzN/EIuHxXA6ijNXUHs7bxWp6IrDFCuuIsld0+gB4Gb7BAV8F0D+jl2vnN08/2YB31aev+U9bqPgLEB/31PfoP2zY7TGMCDn27z4t2kkLkYTuXEi//PfQNvFmsUChRkgyh9Ip5hwWVLkP5snAu1PxVGs1lB2DOTzebxwlMj+JRtplaMnD1JjX9Of8DZu3tiuOXPYG3DjqyHNOD147UWrUAV1uBRKyFbpEvfFA4J3dbaPUP6cINS0QEtNfePbA6b19yciOGM4if5kgyn/KnhHs5mOfKWNYBXTpH0BUC60VaQp+So44RSK9HfY0DBf5J1p9SUAGBX7qhaJWFZeRKm3gLcDHX0G+Nkn2x/Gn8zw2z6PfRG4+6/dVaw2GhPoi9ID8unDOVw60o+oETBaBJCOGtBNeX+fm2HQNYavPnQAF3/kbopnCfB7UXUMxE0diYiB81b1IBU1sJEvDF+pad7yDh5lH1Nsn2NR/qJcuU9k+AO+QenOLT3/qnefffc3bjO77gR++AfAoUdpdCHaW26CrtVr/wXoXUvXwypT+0wtJ3tr3UtovW0VxYwUNKHtcxLhqW8AD93i/ndylhrIppVEujumKsgV8rh/B5WxXT5AneEXu6egMWBkKOENbvEGfO2ZQy7BA3BJfNXqtXjL5etR5Q+GKKtiokiNcN1gQCcRqZ5uwJc3fKEOVeWvKm7xUPBP2gLwynOX4+ZL1tZtD4QY1ms6Mvk26vP7FwwZf45ehfIX4DVlsnnq2Kl4FPMlvsbwqhcB//sFYO3l1PHLOfr7k9yLVsn/F58GfvYJYM+97f09JzMEmYl7mzlA6nL7/wAANqUquPoMag97pkuewKwfjDH0pWR7mnMS+NNXbEbE0DBbrOKRvUrgkZN/BToGefbQ+6/bjP9816Vu7adijQWnegKk8l3bJ1b/qrVJIY2KFrrkz/8eTeP2YkCqJ+D1/IX4sauy6Nuyc4mwebJBHbJj9CrsHbEAU36SBAlj9FCxa9LGEUtfrr+Kis6pbbQ4Q5M39QjtP7MXuO8Tp4RgOX3J33GAez8GPPRZd9PkPJH/WSupk82UGCKwYPBio/0p8t4ns2VsHE5RkNZtlKZra1y0pg8v2awsh8fJv3dgOdYNJDwPhrG8g4FkBL3xeqJurPx5Yy9nKSiVORA86SWA/D9043n4g5dtbHxdVPCAL+PlBPwLwNeB+chfLPzBV2zaN5WnmdG8o2fz9HcMpuOo2Y6cS5Aa5qU1inxRmhQpOs2UnbFWlUtF3vu3ZA+Jjtsudt4BzB1e2He6Bcun/IXdwCe8jcSLePlmag8WdE9gNgiDaUn+RS2F33npGXjqg9djTX8ce6cUFcwf2GVbxyCfMbysJ4ZL1g+gN2GiJ2bQqmBqbR+1AGBQTr9Q/u2qfkC2HT/5WyUAzDuKFTPkAerHlbxceF5V/uooQdT6X3MpvTaqDCrUuWi7ooR1fkoKEBGfEA+QFCf/kavp9cCDJFp2/5QejPEBILmMjvH5q4Gff/KUmL1++pL/+DZgfpRu8uQu4Du/jblZUkQbl1MDGi84iKKKc5ZTozZN010mT/ihboNX0ioNXcOX3smXwzNicp/kEOIRHYm4jBPkLAMjQaofCCB/3kHcbJ88cNsfAz/+Mz4c5x2xie2zIPDvM91ApWYjW25h/TBfcxH2lBGFbTt425cfwZ99+2n378jn6fPBND1URWkBADSiqpbkugSMUecTnfHgQ7RE5oZrKPf6wX9unvrqR2Y/8M03Avd/qv3vdBNuqmeRHuoiLZDPPVlp5rEyTWQWj0XdYGwjDKRlfv2qlSsR40HcDUMp7J9WyZ/abdnWMBhgBa4fTCJfhc/2aTCJy1X8fFu7Of7KeQQqfzMu40UAJ38xEuGTMEVdrCDbx7ZkHGzt5fQ60YD8BaEL8i/N0QNPKH9xrrWqQv587Y1VF9MDb/8vgIdvoVnApTnqx0Ob6aFQ5dc+aDbzSYbTl/x33Snf/8ergOdvxeAkTS7qT1PjnSwxRFkVv3Mlt0k0k1a+gsyEkPnHPpWt6USGRkwqIL4Y9jtfeqa7WwUGRoYadJK+dTI9Uv0NNdVz/iipC6skHxIdI/8o/1OoE01ly832rrd9KnK286P7ZzCaKeLxgxl3bYBcgch/qIeu4XxR6fhmQlH+/PokhmQdlV130d/3W18DfoMH8KwW56fiya/T68GH2/9Op2GVpd2jkn+mPjA7pOVcYvzEGy6GrjUvtDfcE4MFDSVEsH5YZnZtGExg/1RBjuI46RZtPZD81w0kkK04SmE3XwqxGqB3lwM1AbCFKX+X/AM8f8OX1aQb8nqJNracFwXoXaMcU5kQJtbSHtxEZCzmn/iR4+JCHREWpmlE4JK/Gaz8dZPiW9O7vXNsEgPAxW+VoznglFjs6DQm/7tkKiW3EiYr1Fj6EtTYKo4BHbYkFc1wc6vPWy2Uf8L9rA56hB4O4gHByX/LGcvcXSowsWGwAfmbceAd/yOXowsK+BZnlHrqcSLsJp7/gsCH94L8p1v5/n7bpyrJ/7+foM5Usx1sH6ftxaIgf7qGHuVvxOjvErYPQKugCdtnz73A+itJ6Z31KtpWa0L+kztphAcQwTz1DdCqUNtP3BD8O28HfvC79N5D/vvpPU97rTkMaXveJYwzV7bO1FqWjqLm6JhzElivtK+RoSRyZQtTOf57gvxrzLV9VKwbTCBfcdxMOJrkpZDxxuvke+HvM+Yd8bYDrYnt4z+OavsIobPqYuB9T3sXoNcDbJ9YD9WSaqn8lVTt/CS3fQT5617PX2wH6FwDZtfjnBu9+zVatewkwulL/rMHgc2v9GyySkRKqXgMGiNiBqAoaYX8V3Ll71E7PugR+tyQto9/36bKv+54AZ5/MUNBQosrJCPaceWv899trfz9tg9dT0eP4I7njuK1F61CIqLjJztIvZc4+afi9Dtuxg9Ancjii4C75D9MnTA3STnVG66h7e5C4k3O70fvB+74/+j95A7q3Be/lf5/6NHG38tPA898t/nfvRhYZXqAidLWljLDVyjEc34NALDNGUGskvHU82+FZekYqtAx7yQpMYFDtDXX+uGkW3EMDAWUi1g/kEAVOqyqmIdQ9mbzbLqu7jsAaJ9O2j6efU25n1D+kSRZP6o9pKZ6ioBvNE2jlckdwUFXYSuK1E6A7ke14LV97Cr1vWiPt++LtTrUeQjrXkJC6uUfkIXuQuV/AmFbdON65KJihk3koekG+hMRlP3kr5m44bwVePPl69ArJkypAV8/dDNQ+auNpQwTG9olf8ZIXYuMkNwY5UZXCtQpTb4gi3K+xwT+8DBMbvssVPlXCgDTkbeA+ZKF81f14IozBvH0YfJfD03SUDwepd+pU/4CHttnCtj/AP1/w7X8PA2y2JqR//xhWYZAZKeccyNdI//EHBXPfItKTXd6gs6RJ2mkIshGTfXMHKC2edX78bW1H8EO/SxoxWlpEbVB/sPpKCzomEcCI4ryF6PMfSLoK1I9oWMoSPkPJGBBQyZXwBfv38uzfZSHhGqzqFDtznYg/ia/Fx6wIh0RrM/2EQLBc0yNpx8ryj/aQw+J0qw3Swigh4FQ/uK+ALJip4f8rcBZ9LQ+tywJgw/OUKoyAGx5J/Daz9D7UPmfQNgWNaJBmfkShRwK9ycjivIvuNuvP28FPv66C+Rx3IBvQM61ZnqHvwmh/GWDsZiJ9Y0CvkHQTTkLVKiHalF6o0bnbR/DMMHYIj1/I4pZvm5wfyKCv3j12fiNS0YAALk8ddx4VCh/n+cvIMg/OQRUspRFEUkDK18k99GjzW2f/JR8aIop++nlwIrzadWwRnDrsTdIDVwsxAOnMM1LYvhsn771QKwH/1O7DHZikMhK3Pc2Huou+Tte8l/TH4ehMTy8dxqfvfcFPHuU7kEVBjYvryfQdYMJ1BwdllXFJ27fRm3O78Ff/zFgy7u929RlHttBQ+Vf8KZTA1JdA5LAG40yNFNJ9WT0kBBtq+qbTV2a8yp2gYnn6VWQv27K+lVBa2AI5c+0+j4hRsengPJvLTFOVdgWNbjBze507ziktz+QjKAy7aulE6S4RENqZPuYcS95+fZ961VnIh1bAEkHnUO1ILMwVOXfIduHaTQSmsq1IP865Z8D9AhmC9RRexMmNi1LY+SStcCzQITR9ngsAqDqs32UDi9mOIvrt+NHwPorvMtU8lIcgajkyT4S91GQf6yXRn5iBaggiH1VJdgJHODk79gUcxC2j1Uky6GXRqSHZooweoeBvHIOQULDh2U9RP4lPSVHqaBMtJu3rME3H6W1oc8yq7hAB2owsGlZPfmv7I1DMwwYjo21aR2oon6t5yvfW38Cl/++d3GiVmg4yasUEPBVyV+xfYKgm5QZZJVJ9WuabFvqxEggYHTH6LyE8k/5PH/bqn8Qi1FJ0KgAaPyQEyjMuJNCTzROb+Wv6cCFv+XaBzEmhtUaBhIRlB2h/LP8KR5wOfwzD1UI2+f8N1BNG5ESpuy7YqB5yl4dgsjfqfHl+uI+5X+s5G+6vzmYjGA618L28ZNStQDoEWQU5Q8ABiePCKgDmIaJuKn7bB9FNaq2D0CELIK87v5NyF+QpngoquSfWtZc1Qu7INdh8h99TKby5ie9yr84g4OlGN73rSdxZK6IWC8nHXGebdg+g8kovlx7NR7p/dW6zz7+ugvwyd+4AO+55gy3DEQsFgucMaxrDK+6cA1SJjDP52XUkXEQrvhD4OzXtN5PoGHAt5Hn7yf/ANsHkP58aV6WfhBty6/8RY6/+PuiaVL7Yk6AP9UzYJ1sNxgdFPQV3wWCUz1HHwf+fgPw1Dfltme+A3z2shMyKew0J38DWHc58GufBgDEfLaP6/mXc42H2m7NkYAOGU1TRlF6uXehFP+ElYWgkZVTmJHr8LpZNsdq+8gZvkOp6CKUP9k+Ga78xWIy4iEagXjY6uiJGz7bJ4D8RedjOnDOTd7f0qPBQ3ZAEnfFZ/tEeyhNr6D46X6IQGEnlb9VpiwtYVt5yL8AFGZw7wELtz51BI4D9AzyCUxZTv5t3FddY7g99QZkV7+s7jPGGN542Tr8+Q1ng/F2m040tmiSsRh02DBssXj7MYqKIKiK2HFkBla1zWyfpsqf2z5iBNlQ+fPrO8Ct4IgysxyQ4kMEnGuVAOUfkVVtg+5TM+WfpUoC+OHvy8Vijj5Nq96dgEXoT0/ydxzvkI3fkJQuA2pb1vdj/XIeoK3kGnc4jefyBz0cXv8l4JUfrt+uHqsdFeX5vQbnUczwJeyUoN2xkr9b3sHAYCrSRqqnL/fctX3oe2IxGXG9hfIH09ETM32TvFTy99k+G19OaZ8qjEgT5c8VnV0le6U0xy0AXY7GGpG7a/t0MOArJnCJshcq+Ts2YBWhp+TfNzjMZ4vn+AzmNpQ/AHz5HVvwf244q+HnmsbQm6TrnE41iTtpBnTUEGX8fhn1geFjhvibSnPA995FCvgX/8xjWUEBX1+2T7SR8uejBHHPgcbKX4gEEQeMpin2AgCbf1UZ5RvS9vE/CFvZPqyBvQXI4nkAcPdfUVsV4qORsOkiTk/PX1x40eD4TUqwKlUjZjpef8kaYPDFwFfAlX8Tn9WMB3dIsdi0Hx7yX6jyb3BLrCLP9lHJ/xgVmjg3xpX/AgO+TqUA1hNFJk+k7paU5h3AFOSvGeiJM2RLihoKyvbpWU052pf9XsC5xlrbPgA9kEpzciaoKAuQHQN6VtH7mX1AegXdV2H7dLIioziWKHiXn8T0XBbq42zCor85amhYvZpPMhSedJvkf/aK1gv29KfiQB6eWkB10HRoTk2O1BYqWNqB+Jse+hyVT15zKXDP39A207+2tCnLYAjyb5RZpBv0oCjPy8lYjZR/fpLsXRGriKapkNv1HwUGzlDOVVcCvk1snyCh1sjeAiTBr78KePhz9JB11xM4/uR/eip/ZSFsAC4Zq7YPANlIytnmGRZmYmEq22P7LFBFNTsPI+Z9mByz8pdKfVlPFNmyhXyzEg8+24fZVTi6idliBamoAVPX3OMBwDUbOTlpOnpihk/5B2T7mDHgjx4Gzrw++FwbZfuofn214CN/TgiCWEtzwL+8CLjj/8j/q59nx+S2xUJMVBvcRNcsP4mj095jjpZieMeVI3j0L1+BPmH75Cdpf/8I6xiwdojuwbK+dOOdNAPMqSEqyL8rtg9vO9kxUujvuhu46n20ze/n6xHF889RW2kkzlzlP99a+ZdmqV2IyZ/RNI0wVeIHZBzBDiB4Nc+/qe0ToPyFePn1W6gA3dQuKT5OQHbQaU7+QvnTTZKpnmIxF1ErJ9tcbRmxttUYHf8YlH+r8+ik8nfJXy62cmS2ybq6AR2wChOzhapnIRmx3+qU5v6/J242zvZpZ7JQUMDXrgEP/JNnKv+Te0axdec+WCYnO2H7CL/3MF+jdYyvPVxWsn1sG/jHs4Cvvq71+TSDKFGRHAaSw6jMjSOTzXt2OVpNYDgdpUwdI0KTgxx7Ye2sDSRj1F4Ms0lb4XntMU3YPl1U/pW8rAb6yo8Ab/0BcMV76/cVHng517x9CA++nJUB30bKvzhLxC+EQSMryU31tIJTPe3q4rJ9hHjRo1QMrpgJlX/HIS48v3E5i/5M0yl7O5ehKP9mKnqhyl+UpVV/o12I3wlal7VO+R8j+TNeTVEh/9Fm5O8P+AIo1HRkChXPEpLuQ0KkN7qefyPbp0EnVBFE/keeAn76YeC577ubntt3BPFaDlnGCcMlf67sxTJ9y88nsi8pAV+xfqt4bQcHH/HOFgWk8k8OAclhTE8chglvQG/WSXmXaRTlvTtM/n7rM3gfHQwOVgjrfaGCZSHnIchfYNN1QM9K775qwDc/KQOxQdANOcNXBHzF8YOUf7xPjhCiDWwz1/Ov1t8PcW5WI+XfxPMX/cGI0nkUM4rnHwZ8OwOf8h/L0Y3QnJr3ZoqgYyvFdem7gYvetLBzEJ1twbYPP484zwX21BXxK/9jtH0ATv4GrVcM4HBmYco/a9G6xx7lLx4SQuloOtIxA/PFqiw4pi7Y3Q7ZBE3ymtqp/CY15bHJGfSggCw4+RtRSrkUwVRB/kaMZ5I4dA75SWD7rfTZ2pe0Ph+Bf78e+KdzvCW381N0DWJ9QHIIWmFSxj84Mn7yFw/7bpF/MzuR39eVCU5YC22z7UC0iUq2dUBZzfPPTcgHeBA0k+5jrSLJXLSthspfkH8DK0zTFWvHH/Dl15OnOQd+F2ih/CPUJj3KPyT/zsDn+Y9nq7Ad7qOq6lVVIM063ZZ3Ahe8YWHnIBrGggO+vJOKUhFKeQrK9lEVdufIf1k6BlNnONxU+dc3l2xVw2yd8veu4UsBXxOW7aAo1goWHbTd+jBGRCongUmF/HuoDMFUZgY9LI9ZW8kgSS0n28dxJPlbJdnxBs6gji4qgbab7aIqy3v/Vr4vTNFEHk0DUssQKc8gyixUdRnnmEXKrSALQPrQjQL+i4Wr/Jscl++zIs7vTTezffzKPwgq+edbkL9uyrIeYgTZtvJvRP5Gc9sH4OTfxPMPyvNXlX9igNJdSycu2+c0J3+6EZli1V1dK9D2ATqjolWIzrbYgG8kQY25T1mVy4h21vMHqAOYcegaw8re+IKV/2wFmC1UZY6/uqnT1zsAACAASURBVF/Na/sASokHtyZ8G5YPEKz8J3fSIhoAajxlr5idRRpFTFkq+S+TqyyJcg41Jc1ucBO9Fme8590KanqourxfYVpaFYlBxKsZxLQaHK7uSyyKMiLHyfYRSQ8tPH8Aw5FupnoqirjV8dVJXmIB9Wb7ijWG3cSBNpV/w4lj3PNvZPsA9BBbaJ5/rQyaVWyQ8q+VZZu2Q+XfGbjkTzcnX7bk6lpaI+Xfekr9grBo5a88NN74DeCa/19+Zqp5/qwz53zzV4CX/i8AtGB9c+Vf/3szJWCuWEVvU+VPk7wApbibEYVbi6UBdk/k8B8P7uP7B6R6Tu2kMhA33YLPFGlG8DCbhcYcjFUUgkktpywTtbSzX/kDlIGx6RXtrxsg4gh6hFRmdgz48f8G5kaB5BCeHZ3DRCWCmF1EglVhJGjG77SdgsZolq6LWJc9/6a2D+3Ta9BDr6Z1UfkDbSh/7quXc95qm4H7GvI+RhLe46vK33Gk8hfXOiiu5p6rQ+2gTvmLqgD5Fnn+AeRv8aJ5jMnZ3wKh7dMh1LzKP1euBZO/pikTnTqt/PnxFjvJy4gCZ1zrKUzn1vYBZCM6Vqx+sVu5cXV/C+UfYPvka3RdPcpf7CcUtKYqf97IGfPWRQrAfz85ig//6Hnkylb9JK9qiQqkDZ0F50VvxvcnKF1yJSOCP1JSOmY0TZ1V7ZBWWQ65z34NFS97153NZxL7Ici/bx09TB77Ei3MfuRJIDGID/9oG368i2Yd9zrz0Li6n3VS6Imb3gVbuuX5CzJqNrLlv9nDJ0Hmal2gBU+srR3bR11MpYXnL+6jKKcs1huwFPIX9z/WR6Pp130BOP83GhyTX7NqMcDzF8o/1yLbJ8D2qVWkeKsj/9D26Qx4J8+U6AbkyxasINsHaF6v/1ggSHyxAV/34eFbRk8l/w5jdV8c49kSKpYdvEPASMPm5+lZo7iB5w8ElHVuQv45nh00Pl+qJ+WZPRSoHz4Lo5kiJkt0bmt0sgAO5k3valZOzevDqso/OUzFy2K9zWcS150gJ6e+9XS89Ar5WWIQM/kKDhfpvJJO3rV2Mk7KLYbnouvZPq0DvimN/u7ZSpfJvy3PvyIn77Xy/MHvc0SZO+Inf3GvxXW+6LcaK39xrarFRdg+TbJ91ABy3FfcLVT+ncH+KbrR39xKtTQ8to/fulCndHcSxxrwdUckmnwAmEqqZ6cDgyDl7zjA2FwpeIcA2+fXL9mAt1+xHldvVtLxAj1/bvv46/s0CroB7prC4/MlnuqpnNf0bnod3ITtR+dRgQGbGXjpCvrNSSuGOXeUIao0KjO/rbKyAIiS8teqdLQKQU69a+jcasrflhxCplDBkaJCEJxsZpHGxmHfQ69rtk/7nn+S0bXLVDo3yazuPIA2sn14Lr14uCabKX91RKFcUzPuzcAScQFxnZueqxAvxca2z2Ly/K1myr8q9zlOawGcduRv1Wz889006eeZo3kUKhZyZQs2C7B9AKlCOk7+x6j81YeGCGAZcXm8Lij/dQOknA7M5IN3CKh6Go/H8eGbzseydEDmlMfzD1D+g5sal8iAT/kbXPkLNS/q56SWYfvRLBhjYNEkkiWyYuadpIxfqCV6ASIJq6QQgkL+QVlFDU9wXAYQqyVPgNGOD2KuWEUOysiNk/91Lz4b3/+DK73HEoq04yNQw/vaZJ8Y6OE6V+6G8m8Qawvcl18DMX+iWcBXvV7NlL/ICIovgPwbFXbzn6fnuy1SPV3l38D2+cLLgPs/1focO4DTjvwPzxaRy1MnLNUYfr5zEvmyhRrzFnlz0XXyX2BnDnpoiFIIRlQqhy6Q/xlDvlWg/AhQ/oEPN+ZT/jzPH/At5fj224BXfKjh+eQrgvyVTiOOKbJ2Yn14/ugcRgaTYGbSrZw4hySOzIrFUXitFlFYK5KUnr9YIEfATxrNkBsnYjLEkpT8e73rUBi6ELYD5ByF/M0E0LsW8dXnyyJ4Aq7y73DiQVuTvGifuEPnP93mn7+o8wDay/MHKHAOJtOeA4+r9C+1ZMgxKX/lHjRK9Qz6DGih/MuNlb9dpUmHkzuA8edan2MHcNqR//rBJD73xgsBALFoBHdtG0OuXENNa6D8zS55/mJ934UGZd1YQYDyN+OK59/h8wWtDpWM6Ng72Uj5y2tXRhNbS9MAMI/tEzV0xEzNO8u3BYTyH5sryU4jiLk4Sw8eM47tR7M4Z2WaSN22YOsxHHEGvbaPoyj/SEJ6/n7fV51d2vIEJ8mPNqIAHLKR9Cjwp89iup/a4DwUQtIjwJ88BVz6O/XH6vYkr2bthQfoI3YJZcfAbLH9e7Tg8wDa8/wBWpozOdTc4lQ/U+NHx6T8lWvVyPYBmts+TkDcTLWKIgnvdahV6QHl1GRp7y6jI+TPGLuBMbaTMbabMfbnAZ9HGWPf5p8/whgb6cTvNkJUJ2tg84o+PHt4DvmyBaeh8o8Hbz9W6ObiZkrqzWyfWFeVP2MMG4aTLZW/DQaLtbC1NN0T8AVAJR6K7Qe2vJ6/qNfCiZmn7TmgekTrB5PusN8e3AwbGnLCYhKTdoSXaiboOJVcfapps0Vjxp8HxhRVlhsn8hf3p5hxxYQI6HqUvxGh+xskCNyAb6dtn/azfcxaERWYbonuzp7HQpQ/b9tzh5v7/UAL5a8GfBfh+fuP7///Qmf4qsof8Kr/WkWmIovZ6F3GMZM/Y0wH8DkArwJwLoA3McbO9e32bgAZx3E2Afg0gL871t9tCh48SSXimC1Uka9YblZKQ+XfccVlLq5GiqvUlEYiFI0n26fzyh8ANgylsHcqF/whv3YWdDit7ASRYaN8ryfuq+nfAnmV/F3bhxMzn7BTqNRg2Q5lG3EiZ7yOvltC2h+AjnDPv1KozzbSo3yU4Au6PfFV4N9eCnz9Zhl3yE9y24ffK7HmAoBZ/pDzeP7NHtgnQZ4/q+ZRZYZ77p09D9Xzb7H2rzjn+SNyacVGcPsB864RYcS8k7yKs7RPo3o+Qb/vOb74fwvbp1mef63i7dce8q/KmlDZ8eOyslcnlP9lAHY7jrPXcZwKgG8B8C3DhJsA/Cd//z0A1zHWwbq1fvCOm4rHkClUkC1ZcETj9/vW3Ur11COLU/6u7aMqGjXbp0vzEjg2DCUxmimibAVkHPBrZzm6vJ6NHnDqdebve2K+1bxaQAZ8FcUkVDlX/uJhQuRPRK4vPxtRQ6P5AUA9+ZsJOk6g8o94f0fgZ5+ktpI9Qnn8lTx9Pzksyaw4qyh/+q1IPC1LizRrD/ET7/mjnEOVyZXZ2sHeyRxu+dnu9s8DaF/55yfqvfFG+0aS3hFVkPKP9QYmLdSfqzoXyJ/q2cQSUvcX5G/bctUuq+ztL/F+2f5qVZnEUCsfe1nxNtAJ8l8N4JDy/1G+LXAfx3EsAHMAmkRxjhH8wqcSMdgOcHSuCKY1sn26GPBdjPJ38/uDAr5KYbdu1FwHBX0dBzg4Xaj/kHccCxpY0AjFs686dF648rdtB/lKDYwBE9kSbN1H/lz5i4dJT8yU12n4HKRjhmsbuQ8i8V1X+ee9GSLq3+NP96wWgM3Xkz++8w4ZcE4MyNGjqvw5gZ63ph958M+btQeTZ3J1K9unjdo+qORgadEF2T43fOYB/P2dO1vf14XO8AXoYd0oF99/XP9iL0HKvx2/H2hO8K2WaHXJnxP+f90I3P0Bel8ru+1rrlDFqLEexQG+4I9d9S4o1Gzd6Q6hE+QfpOD9Y5Z29gFj7D2Msa2Msa2Tk8ewpion/3SCLnSpasuOV2f7dMnzv/htwJV/vPDvBZGqx/Pvtu1D6nnPZID1wwT568EPKRVCYTHNVWQL8fxFps/qvjiqNccty+2Ssk/598QNqaKWnY10zFRsHyV1D+CBYV4D3m/7uCMMHwFaZVoJbN0VRP4iL1uPSjIrSeUvFrV/wyVrYJn8vFo9sGO9XQz4Ni/pDAAoZ1HTovUT0BrAcRx3QmCuVSDfU1CxlfJXrkEr8hft0P8QN2Ne5V+Yrp9YBeATd2zHX//Ql13jsX0azPBVf9vzXZ/tM/UCsO9+es/LQNdsB79+y4O4ZturceWhP6LPahVp+wBUKqTL6AT5jwJQqo9hDYAjjfZhjBkAegHM+PaB4zhfcBxni+M4W4aHW3h9zWALz182CKY3Uv5CSXeYTM+8HtjyroV/Tw+wU8y4zBzqsvI/c3kavXET33v8MABgMlvG3dvGUK3ZbgeuQYdmtEhlDcgv74kbbWf7CMtm8zIizkkh4gQpF+eAWB/mOFH1xEwg0U/rAfeNIBU1lIBvgPIHqJCb2Yj8ffmOIkd7/ZXA+LNKGqshyd+n/NNRAze9aDX6+/kgt9U9Swx2vqhaapjuWwDxuVCUv23EMFtsT/lvP5p13+earQAHLCzPX71OLZU/b3919zHuVf7zR+QyngrueX4cD+72LeHpGbU2s32CavswEjyC/Cs5KkAoSkQbUfxi9xT2TeXxl685DyMrqG3UqhVv7ancRP2xO4xOyIzHAGxmjG0AcBjAGwG82bfPbQDeDuAhAG8AcK/jdDGiwT3/3oRsZKyR8u9Wts9iEZTq2btONlxX+XeH/OMRHe+6agM+fc8uPH9kHj94YhRf+sU+bFqWwm039yMBoOoh/wZkJZSeovhIjVNN/2Yhn8/c8wIMnT6//IxB3LdzEi9MV7ERIFK2a7QCl9/zv+r9wAU3A5pG5F/2K39O/sIiKGaCA76AN91TTBAzYrL9iBxyXSH/WsVV/lTsjl8jMYu51T177WeaznheFDZcC7z/WaDX78QqUHxqx4hhdr618nccB//zjNR42Va2D2My5badqp4CLZU/P/dWyn/+CLDhGs8uVs3GwZkCYoaPE9oO+DZJdrAtsn4qfAQ9vdsN+H7/8VH0xk287Yr1iJsa7DsYiqUSUsUpINpLbfs4ZPwcs/LnHv57AdwFYDuA7ziOs40x9hHG2I18ty8DGGSM7QbwZwDq0kE7Ctf2kdF/TVms3AM326c7NsqCETQd/6r3Ab97H98ulH/3HlbvuGoEiYiObz12EHt52ufuiRz2z1Bnqjk6DHE9G/nYQco/ZqJaIy+/Gf79wX34yi/3AwDOWp7Gip4Ytk3wjlyrKHVa+l0bqSduUk74yosAgDx/McoQheYsxfYBKBe7zvYJCPiK90ZE/j2C/DXDW6iMiwnP6mbu2rItSG/d5cByf6LcMYKx5sQP+Pz4OLJli0Z6TfDXtz6HW362B8kItddsOyM6159vke2jEm6r1ExX+fs9f678HYeqg5bn6pT/aKaIas1BtmyhVFXaZLNUz1a2j/i+UwOqSsr0+DY4VhnbJkq4c9sYbrxoFaKGjmU9cVSho1AskjU1sIEnFpwC5A8AjuPc7jjOmY7jbHQc52N82wcdx7mNvy85jnOz4zibHMe5zHGcvZ343Ybg5N+Xko1MNxrZPkL5dzjLYrEI8tKNiAxWdTHPX6A3buKclT3YOZbFgek81vBVvqYLdF1rTIfujkBaeP5KdsW5q4gEH9k73fC3a7aD+VIVk1ki3FTMwCUj/Xj2KCdbq+zJ2RY2kphBLJBSyd/v+QctHi8QFPBV114V90dYCprpTV00pe3TV6f8TxKB4YfS9rWIN2DdCPc8P4GXnzWMb//eFQDasH0AeR/aneELLMDz991Hdx3fsjvr27MwEuBJaRbtzXOe/nPx/7+RYNQMPjpV4mbj21CrlvDIwRwuGxnAH//KJgA0sbIKA8VSkTz/5JBcfKjLOO1m+AJwg3HxWBQRg/5EzU2RPE6e/2LRqhpoF6t6qtg4nMTuiRwOZYrYsp7XoS+QOnKYIWMoDQO+9YX0rjhjEOmYgTufa6xq5opVT4pzKmrgknX9GM1xJVore2ZrzhWrSEZ0mLq3Kac9tk9Anr9AQ+Wv2D7uCkwReX+EpaAbvswsxfaJ+8m/C3XyOwGlTxhRejCOzzev8TBfqmLTshQGU3S9FqT8O+r5N8r2URZ0maf4lX+tYHUm+1SuXfJvx/bh5UQqXvJntQoqMPGB15yDZT10DZZx8i+Vy0B+muI+IfkfA7jyZ5qJAT70NsxW2T4nCfm3qgl0nB5WG4dTmM5XULFsXLyuH4wBU1z5Qzdan2eA7RMxNLzinOX4yfbxhrZCxpdmmIoa2DLSjzKE4i7jx49R4T4n1ov5YtUtGqciHTORK1tU1tlfaE4l/KAUQUCqfceR742YtNss1fZRJxcdg+1zoqD0iVicrs2RJov6VGs2CpUaemImUlG6Hi2zfdTfaen5dyjbB6CHtCgQ57N99k6p5K+0O72Z7dMizx/gVWQtyiYDqI1N74ZuV1CG4V4zABhKRWFBR6VckivAjVwFDJ8dfOwO4jQlfzmztD8pyD/qbvOgW3n+i0WrofFxUv6blsnJT2cMJzGYjGAqzx+quqnEJloEfH3X+1fPW47ZQhVPH5oN/JrfbkhFDawfSKLiUEebzebwkydo7d6MncR8qeouFOP5XsxATawZ7F9Q3qP8fZO8dCXVc2IH8LfLgMld8rM6z9/0KlkzBtt2MFc8lWwf2fYTSboezchfjbMkI/Td7IJsn+OU7QN4lX/aS/77JvNY2Uvn0rbto3z2Hw8fhhUkYkTAVyj/vnVu9k7FMZGIyD4RMTRYzIRTmqcYQWKAih2+uvuVPU9T8pde70CSbp4R4Z264Qzfk4T8W5WCPg6eP0DKX2D9QBJDqahL/ppuyE63gIAvQOUjAGCsga3gn2CUjBpIxwxYvCT3A9sPI1GjTrU/b2K+aLlLRKrwKFI31bMNz9+1fUrA7EGyiqZ2yc9c20dR/oY34JstWXAcyMqdomT0KWD7xOJJRAwNRxut6QC4cZaeuAFNYzytdiHKv4Pk38rzF8o/MegJzFs1G7vGs7h0hFJgG9o+flHImHt+P9szF3ydNIMyfYTn37sGqNAooAIDyaj3mI5mIlri6aaJJim5HcZpSv5iAo7pDr1N1/bx3cxu1fZZLILq+avQG8QuOow1/XFEdA2GxrCqL4bhdBSHZ6mD6Eak9UNKneSlYICPxGbywbnkammBqKEhYmjQNIZojAh7em4eIwk6jz1Zw+utKxAB4GxZIf9A5d9ohm9FxghEgNmIyb87KNUTAMyYa131ifMSBNZq+cITBWV0xsw4VvbGcKQZ+ReV9FqIzKo2Joa1HfBVJqa1rP3fINXTo/zrc/zv3DaG6XwFr7lwJXrjpo/8W+Ty821V6MGBbr/n3yunQVnMRNTw9glHMxCtUgabHelwqm8TnKbkryp/Tv6RBiRvnGSef3oFnWNiKPhz3aCaIM0Wte4ADF3DyFACq/vjMHQNy9Ix7Jqkkg/xaLR1R25QQltYIY3IXyh/U2eeDJ5EggjbqpQwkqqh4hjYnak1tH3Edz9x+3bc9wKfPOMqf8Wjb1bbR4gIEWDWlVRPMQlMM+lB567cFncLo7m2z7k3ATd9jpZ7PBnhK72wqjfe1PYRpbLFdffMqWj6O0L5t0r1FCOm3tYl0fVGto9yH+cPu5k+1ZqNO58bwy337cHI/2vvzKMkuao7/b2IyMi19q27uqv3TVurJbVbAqSWhISEhGwhxtiAOUgGCcsDNlhjBjHCBuzxMcuMj8c+Hs9hPGABBuNhALEYhBAIkBBIQhutpRd1t3rvWrq6a8/1zR+xZGRmZFRWZWVlVeb7zqlTVVlZGS8yIn9x4/fuu7crxvXn9dGdMItsn4B6/p7H0tJwiw8WoBV5/naPbGtc4ZI1LkI3iWSsrnJPHK+wi9wC0KDib3v+QmdDt+VXh0wn8i/a5dASs33WXw33vFSSmVDA3Y/CrvfWfCjv2LWGt+9aA1gpaVn7dIlFPSmPQZNeUHKxDekabdFQQOSfQtcEG3sSBbfHiWjEKiWdmqHVyJISYV4Zmiw74ZsIW4/98KVBnjhsrwvIJq07kYLUzIDaPk4JB2ddgeHn+TsXwXzxPecC5to+4Ra45J1z7+2wWBS0Qoyysj3CySDPf8aztgJrfmVBUz21ojumSp5bHPm7C9ey1spZO5h69MAwd3/pV7x4coy7dm9A1wQ9LeGCyP8T391b+jpe3Mi/zH77ef7un0rvJIRh0oo1+XxoLGhnF5YlongLTC5jfcg1jXdesZa3XLYaYU8SLlpht/kiRHDDaiiMJGrIHa9b7/7c0xImZ4t/OByePSXVJ9XToStuMhJg+7RHQ1y0qq1gXqAjbpIeDiGySeI6ZHWTg0MTjCczZbJ98sfzbNJTVVErSs0Mqu2jO+J/Nv+3EtvHk/KaxIr8p4oi/6VOUeS/qj3KqbEZMtkchl4aHxYU08OK/Bc21XMO4u9G/uXEP2N92cHdqH3efeWuK7hig+WvdyfC7DluXeDPTaf53ovDfMwZok9wI/UQAkv8J5M+CxadRV6O5++xnLRQ6edFM0LEhHXxOTq5ePH4ElG8BSabdsXJ0DVadc9teVnxXyYf1DrhjfyFZhT6sn5o/pE/WL7/mYnytk9bLMR/ve3Cgnz/9pjJjAxhkiGmG6CH3VS91kjpNrzpdGdnnDUCKeti5BWfcuKfTULWqdPv2D6eyD9TFPk7d5ChCGfPFnn+Sx2vzRGKsrItSk7C4HiS/vZSi6agmB7WRSDIJspvx7De/9nusucj/sXH0e2oZZfmsH93LlJb+hKu/dKdCLupngcGx8l4ZdFHF3IihI41eVve9snmS4Z76ippPnc9hueCcHh88cS/QW2fTKno6GUiUecEKz55FAX0esQfzc72cfxuP1zxL/17Z9wM8PzTdMRMu+1j/li1x0IkCREmRUxLo3kmT2eL/M8l7atIJZG/N9XTmTvyjfwdz7/Y9om5nr/fRPSSpKjW/sp2670tJ+jnptMYmiBqH585ef6zRf1Q6PnPRusq6zzsWF/4uFtds1j87aKPnvOjO2EyYZd42Hd6goxXFn0i/7R9cciUm/D15vmHWwp6Euhm6f63J/Ln4MHal/F3aczIP5f1Ef8ykX/HWrj92zBwxeKMbZmyuiOKFF7xN4LTTct4/mCJ/zNl8vxHp9Ksavf5gERNkjJEWKQJEyIei3Hf5ecxPJnkum2lNpk38nfsKrIp62LkCJDQSsVIN6zHMzOebB8/z9/ud1C80tmIWBU9I4avZbIkKartc15fK5qAh148zc51pamHY3aGlRM5JyIVpnoKvbKFbnPx/Ls2wn2nSu8mCmyfXF78kxlMQyPsKebWGbfGNDqVYt/p8XxmIFZGT7H8pzCI4Ng+s3j+ZqKgj4Duk/Gle7Z3YspqQpQI116al8nZOUdynvQ+B73MhC9Y1f7m03iliVjdEeM7f3y19YtmwHm3wBV/WP4fAjz/zrjJ6GQKv8KuZ6dS+YlSD/nIP01YZNBCEe7avYGP3HQeXQmfW2ld4+6rN3LHa9eRkU5ht2ThRSsU95+E1cOFE74Fto+z0rgo8ne7rUU5613duxzwHqNQhBVtEW6+aCVffuKIb2Q7NlM4z5IIG0ymslz/Nz/hyk/9iK8/fcx/O8WrocvhXKBjFfZ78rORij1/LV+ArtgmdDICRyZS7D89wdqefKvHZ0+U9rNO5qzzKSUNJlLlxN/2/MOJfEl2PFmHBePPnytThDl6xqeRUg1oUPFPl1+Zt1Qmdpchm1fYEYwegg3XwHV/Vv7Jru3jL/6ZnPRt6WiVRSi91W6PhZjBJEIKk1RF9sG9N23jhvP7PJF/2hI6JzWznNVnmLbtY4u/4+87DdjBJ9vHE/l7V/cuB4oif4C7rtrA+EyGbz5zvOTp56bTBQLqWGwHBic4NjrNI3vLNGIqttyCeMdXYdcfVPbcctsCj/jnF/0VR9VOfaIzkyn2D46zvi9/x/HoK6V3qDM565yORyMBkX+2sE2oXZ3UCPuJv3Wu5PQwGQwl/lXh6/mXsX0UlSMEIHwFvYSACV/nwzYyWZjTPJPOMpPOlYn8TZKEiIg0Ri5d8Z1aZ8K0Oo+BFc17M06K0wMdjEhh5O/gF/m7tk8+8h+d8l94tmTRNNxme7YtcfFAO6aucXS0VIiK02u98yvbVrQw5RcNQ+WeP1jBRUtfZc/13ZYn1bPI828pWhfiRP6HRyY5PZZkY1/epnl43xlyucI71Glb/EPhSJlsH7uZS3IiX9rDtn7MsM+dj1Y4aX1EiX8V5LI+to/9BvvYEIo5ILTKMqPcZi5+E75W9Fc86euujPWL/KMhkjJEXMsgsjMVi0hn3MxPVGeSFBQXKxf562Er8i8W/8A8/3zkf2652T5QOnFNUU8ED8UL65yKqpeuaafVLqhXdhuLVdyuoJJrvrifn5/uFH98+lWrL/P6nhaci+GBM2m+7WlaAzCddVKe/SN/6Xr+427kLyPWpG+Q7SPMOImwwbHRCjKnFoAGFX+/yL9MPX/F3ND0yt7DAJvN+bAV5/o7+fF+wtkRM5nBJK5nLBGvsLZRR8wki0cIvPVlilf3OhimHfl7xqcZ1v+62T52dOYWFvN4/svN9oHSlFUKxT+ZyfLSSWsFklVPKb9/zr7+3uVriYd1pso163nt++GqP63B4H1wgg93bibv+Rf3fmiLhtA1wfPHrIn9gY6Ye5w3r+jgMw/uLahCO5W1XisSDru9ph0efOEUjx08SzabyXv+QNau7BqO+ET+9raEmaAtGnJTaWtNY4q/J8/fxbV9VORfFaJS8Q/w/G3bZ3QOkX+bPeEbFWlL/CuM/EO6RizsWeovPJF/8cIgBz1sl3fIFD4Gnsh/BssCsz9C9niyetiq6LmcbB8oE/mH3NTIL//yCLf8/aMMjs/Ytk/+HLh2ay8PfnA3/+Gy1cSC0j43XW8lCiwGxWW8PXn+xbaPpgk6YiF33cjqzqj7/Duu3MSx0emC2v9TWY0cGtFImIki2+fA4ATTGcFMMuV6/j/ZN8S+MWubYT/bx7NWIR7WmfKzkmpAY4q/X+TvXAyU+FfHBbfBuitnf15Atk93wkQISoqHnjBzdwAAHWJJREFUBUX+LWGDJCZhV/wrtw9aYvZzpccO7NoE3Vv8/8EwrW14I//iPgqZ6cKkAlv8xzNGYUXP5YLzvpSJ/F86OUY2J/nFwTOksrkC20cIwdYVlredMMukPy4gL58a4+iZKXI5WXa9SHnxT5dE/pD3/duiIWvf7HTm/g67oKA9P5XNSSYzGjktRCKsl+zrRDJDFo1UcgoyMxyZ0PiHHx3g8ROWoEciAdk+ZpyYaZTcTdSKxvRAgjx/ZftUx23/WNnz3DUBpeIfNnTWdcXZf3q84HEn8vcTf00ThMJRoqQhU0ETcA8t0Qg4c2jO8X/HV8v/Q3GqJ+S35438vXeX0XYItzJsdzvriDdC5G8w7OnhDPDFxw8DcEF/K37Eahy5Sin5/c8/yQX9bdx04Qr+7IE9PHnf9SVlkvNlvG3xFzpSSiaSpbYP5MXfaVlqWXwm3Yl8GihY52gKg5xm9TIoEf+ZDBk0MlOWhfT0qTR7Tp3jcmnNL0UiPnebbuSfsNJma3zxdGhMJcyly3v+asJ3cShT1dNhS1+CvUXiP1tNnOsuWkP45V9Zolxp1gjQEouA0za4kuNv+Nk+RdlimWkIexYhXX43bL2Jw7ZYrulcZivGnfUPnnUwlu1jdUNzxP/Jw6MYmnDr4Bdj5fxb/1NcvXIheOnkOCfPzZAIG7xwYoypVJbRqZSP+DvHKe/5T6Wy5CS+C6i67CSEATvSt1av59w1JCN24beRiRQpaVmfcR+LazKZIYtOTE6BgKdPpZhKZfmGuJKJdJQbEj4L1zzZPrG0XlheuoY0ru1Trvemsn0Wh4BUT4CtfS28OjLFTDofJY5OpoiEtIKyDl4i0Tgik7Q+0HNoZtPZkr9QSE3nw197nqcOnyn/D0a4dMLXbfrjrfXu2bdYJ/Rf4jYF39izDMW/qNRyqy3+QxNJxmYy6Jol5ttXt5WKrU3MNMhJmEn7t+mslh/vtTpiHRuddlMifYvK+dg+zvOKPX/wi/yt+lXt0RCayCcnjEwk+Wb2So5vf78bpXsXK44nrcg/bhdqG8tY2zome/l89ib/lbse26fiUhkLQIOKv195B2X7LCoBnj/AlhUtZHOSg0OTHD0zxT8/dohRu65PWYyIlWWTy8wp8r9xe76ZRjIn+OpTR3nwhfJN5NHN0lRPZ12Bx+qRPimvB4cm6Yyby9PzLyo90GKXat5/2rqgXb3F6iHx2o1lek0AibB1vGslYI/Y4j+dzvLcsbPlt1UU+Y+lJBNJ63hWZvtY9as0TdAZzxd+G5pI8oQ8j+yuu4mHSy90k8kM0iOr05hEQzp9rdYdRCzs83nwTPjGgrKlFpgGFX+f8g6RduuDGy9/4ioWkIDaPgBb+qwJwn2nx/nar47x8W+/yIHB8WDR9Pr8c/D8t6/OWxQTKStKC2pTiBGxa/t4xN+ng5pbLdTDwaFJNnQvs6gffBdgOSL5rF2H6fcuX4Mm4FqfWkoOMbunb9mFXlXwgxdO8dSro1y4yppvcBqw+NYVKor8v7Nn0G0/mQgUf9v20Q1XlLsTZoHtA5ZN5Hehm0hm6GrNH/+sHuXCVa2cv9Ias3/kn/f844vo+Tem+Gd9PP9YJ3zgWdj6pvqMqdkIqOoJsK4rTkgX7D097k70vnhyzLe0g4vXlpjLYiFPIHBizNrWqVnF39PJy3ms6LXGUvCrVwvto4PDE2xYbpYP4Fd3x8noeebIWRJhg9dv6+WZP7+By9Z2+L0CgGsHLXTkf3pshj/6yjNsX93OX9x6YcHffJvH26uWc3bkf3Is414k/EqAr+mMIQRs6rXXfmh58e9K5PtPjEwm0TVBWzTk7utkkfgbRv4cfvOuzdx11Qa22eLva5c5tk84Qdw0SGZy/o3hF5jGFP9cxn8VatvqsmKkWGAckSxj+5iGxprOGIeHJ92+vemsnMX2mV/k7xVsp43AyXMz/M9HDnDn/U/6b8db1RPyto8QZO1m8kI3+IMvPs1xu/Txuek0wxMpNvSUWTy2lNGMspH/CyfOsbYrhhBi1rIVCVcQF9a62H96gmQmx0du2sbm3sL3t2xFUU0nPWPNC5ycSLuev9Plzcs1W3t4+J6rWefctTlly7GifG/k3xk30TThe6GbmMmgG3mBv+WyDdxwwQrueO06/ttbL54l8o8TM61zdXIRrJ/GVEI/z1+xuFRQSM9pn+dd7BW4MtYrTuU6iAWNBdxSD6fHZvjhi6d5ZO9QwepNwIqAMzOQ9VnkBW6zj772FmbSWf7y2y8CcMjO9Fm2tk9R5O9MjJ48N8OazjIL4opwPO2FzlV38ux7WsK0REIF54nj5ZegGaST1oV5PJWvmePn+QshCi/antXcXQnTtXuGJ5J02xlAiTKRv+5NBLB7C/e1Rvjty8p04NMKUz2LX7NWNKj4+3j+isXF9fzLHweng5J3oU5g5B+ap+3jufvIonPx6jYyOcnzx86RyUleHSkq2xsU+ZO/gITDJu96zVoefPEUR0am2Genrm7sXY6Rf8hH/PMiNlCh+NdKvJwJ1247JdOdmCUo8jfIpCzbJ4vutmr0E//S/w25QUN3Isy43exlcDzp5v4XR/7ZnGQqlUX32D4VlbD2LvIK127OpJgGFX8fz1+xuFQQ+XcnwgyPJ13PH2aL/Odr++THsK6nhXdfaXV9ytjVGp0c9vxrR6wAIjNT+JhNmvxk9rtesw5dCD7/80M8e/QsLRGD9V3LMPJ//Udh94cKHioQ/44KRAxc22KhF3qNTCQxNOGWlVjdHqM9FrJWIZctJKeTtTuuZdD4xcERIiGNuFlhbSon8rcng4fGk+w7Pe7OCzg1qpzgxbnbCYW84l/BRdNj+ziTyAttm/nRmArpl+evWFycuRWfqp4O3QmT8WSGaU+uf3C2T8T/51nHko/81/W0MVHkyVt16KfymR7Oayc9i9A86wpS0hH/ECvaItx44QoeePYEvS1hdgy0o2kLv7ip5my6ruQhbz78XCP/hZ7wHZlI0ZUw3YVj//Hajfzmxf381XdfDIz8c7b459AZmUzxWxf3V3Z8PMGFs9Dr6SOjzKRznGdP3uZLk9vib+9zQeRfrmy437bMBDGU7VMdyvOvP7Os8AVc7zSTk6yyG4UHZ/t4xX8uto/wlJvQ6Gv11K8JG/zdwwe48lM/5olDZwq3kxwHuxqjs72ZdJa00xnMDjBuunAFZyZTvHxqnB0D+Vrwy5352D5OqudCi9fIZNJdhQuwfXU7b9q+kkSZstOAdQ7ad28dLdb5ddslqyrb4PWfsL7Ii/xP9w0DuGmb8bBBNKS7k8HORagg8q8kSFm/G677GKzckbfN1ITvPFGef/2ZJc8f8uIPVraFrol8toUf853w9Y5H6HTFTUK6Vclxx5p2UvaE7+C4bfM4F5YC8be2PTiWJCML5zOu2dqLaVgfpUvWNI74R0I6pq4hBO7FeTZMQ8PUtQUXr2E78i8mcEWsZqBlLWHua0/QnTC5anOF63xWX2Z9ARt7EpiGxrefP4GuiXw6KIWTwc44Qk7kH4r5twktxozDVfeAbuSzfVTkP0/88vwVi8ssK3wBulvyAn71lh6e+9gNbAxKk5yv5+8dj2agaYK+1gib+1rY3NviPsX9wDkXmVw634nJtn1Oj8+QdtxSO0sjETa4cpMlKhevbhzxByv672uJlC254UfMp9plpRR3zXIYmUwWBAv58YUCPX9H/O+4chP3v3sXhj53yWuLhnjjBStIZXJs7IkXvBddiTBDTuRvj8M0nR7Rld0teXHXDiz1CV8hRKcQ4iEhxH77u+/qDyHE94UQZ4UQ36lmexVTLs9fsXjMUtsHcLMmADripn8OtJf5ZvsUjMf6/uE3buOPX7+Z3Vu63cwRt6ewt8xBpND2GRxL5ttCevbtA9dt5kM3bvVtJr+caYkYDHRWFvU7xE2Df//1Sd7/5acL6t7Mxs9fGWb7J37gFjZ77MAwH3tgD//82CHL84/7RP4Rg4mi5iff+/VJ3vflp5GagZGzovL+jgQX9PsUVauQt/2GVSLE8fsduuP5yN+54IVC1Yv/YtT0rzY8vhd4WEr5SSHEvfbvH/Z53meAGFBFR+Y5oDz/+jPLCl8otH0qantYVeRfKNi/eXG/+6effuhaNt337/kOSl57qcjzPzY6xXpH/D1JBRcPtHNxA/n9Dm/dOUBPy9ze60TY4PjZab7z/En++i0X+RZS8+PQ8CQTyQx7jp/jmq29/OV3XuTlU+NoAnIS3wtri237PHNklFQmx7NHz/LX33sZgP+xUsPAPqZV2sBXbOjizTv6ubVozqArYbLnhJVC6sw9mCGnK9rcLpoAsVBtayN5qVYhbwWusX++H3gEH/GXUj4shLim+PGaoTz/+uPx2MsRCem0hK1UvU6fqK6E+Wb7FIyn9GKkaYKWSIixaUf8PSLjRP56mAeePc5nHtzL1ZEQ5GiKAON9126a8/94U3fPTKYqFv9pe57gwOAE12zt5fjZaTb3Jthvp+L6Rv5hg5GJFL/9vx4nW2QZJXOCqExb7XirPFaaJvjbt11S8nhXIszIRMrtFQAe26eSTB+f7cRMfVnk+fdJKU8C2N/LV3xaTFSef/2pIM8fLN9fCGYtGwBUN+E7y3jaoiHOueLvidha+2H778L6q/iXXxxhbVeMTSs6Al+r2Rkcz9ejL9tpywev+E8kM4zPZLhle787me474RsxyOQk2ZzkvpvP46E/2c0P79kNwGQaNGFfEGp0rLoTYTI5ydh0xrV9qvH8wcqYKm4PWQtmFX8hxA+FEHt8vm5d6MEIId4rhHhKCPHU0NDQ/F5ESpXnvxQI6OHrpTthug20Z2W+qZ4VjKc1arhVHwvtpSi85bOw4iKOjk6xY6ADw/F01Tnmyx+9fpObtTIX8Z9K58X/pF0vaV13jMvWWBdbP9vHmScSAt5++Ro297XQb2cmjaU8dwI1E397AdhEkvFkBlPXPNk+c7d9wCqLvSQifynl9VLKC32+HgBOCyFWAtjfB6sZjJTys1LKnVLKnT09PfN8EbtOi4rK6kuFkf9AR4z+tgo/JHoI6x6eqrJ9/GgtsH28dxjWB3kmneXU2Iw1+Vnhha1Z+U83bOX7H7Ci7/lE/vsHJ9z+zv3tUa600zN7feYenLUIm3rydXFipkFX3GTcu+kaHStn7cEXHz/MT/cNW+Wi3X7I84/8l8MK328BtwOftL8/UPWIqsVpvac+mPVFzL7CF+Cjt5xfsMI3+DVFvujaXC/u7njKRP6RkNuFqyDbxxb/42enkdIq/ctJpzGQivzL0ZkoLH0AkM7mkBLXxinGEf9z02l+bTdq6W+Pcsdr17GhO+5G9F6c+YTtRSm2qzqiZAY926lRMOhYUfc//iq6Jnjdpm7QbNdinuIfryJVdi5U+458Evg3IcR7gCPAWwGEEDuBu6WUd9q//wzYBiSEEMeA90gpH6xy2/44DThU5F9fKoz8K5ro9eJE/HPtDzvLiuNCz98j/rbAH7UrQg50xvJ2j7J9yhI3dUxD44xn8veef3uOc9NpvvDuXb7/4w0CfrJvCE1AX0sYQ9e46aKVvv/jRPs7BgrTOFe1R8kOeo51jcUf4Gf/+VrrAvX8YeuBedo+8bBRUOm2VlT1jkgpR4CSoiBSyqeAOz2/X1XNduaEG/mrD2ZdqZU1YkSseZ0FHk9r1Mjn+XsspTQ6IfLiv6YzVvGFrZkRQtAZMzlj58BLKXl0/xDnptOcm0rT5lPGYyqVpb8twunxJE8eHmVFa2TWRVnbVrawY6Cda7YW5pqsao+SkbWP/J3ibr91cX/+zsQ5x8z5Ffj7+7dfQmgei9HmSuOdvTk7elAfzPpSwQrfeTFv8Z/d859OZ0llcpiebJ+/+N5+3rlhnKOj04QNjZ5EWIl/hXTGTTft8+iZabdpz6MHhnnT9tJIfiadZUVbhPU9cR47MMLK9tnTeXtbInzzfa8reXx1R5QctRd/Q9fY84kbiZue89w55+cZ+VeaGlstjVfewTDhNe+HFRfVeyTNTQW1feaFESmorT/n8ZTz/O1U0/GZdEHkP5PT+fkrwxwZmWJ1R9SqCKlsn4rojOfbHzrN1oWAn+zzzwuZSmWImQZvvNC6MFScCODDQGcsvxIbajoHmAgbbrVRa1vzX+S1mDSe+Idb4Ma/grWvqfdImpua2T7huS/wqmA8zjqDc9NpS6HsdQRpafDc0bMcOTOV72blWIoq8g+kM2663vVzR89iGhrXn9fHI3uHShZkAUync0RCOjde0IcQhQ1b5sruLT1s6/dUm1nMY+WK/9Lu69B44q9YGtRK/EPRuad5VjAep0mIm+tvZ/xk0HnslRH2nh7P13Vx2vSpeaVAvJH/88fOcWF/K7ddsorB8SQ/etmK/r0XgelUhpip09sS4f7f38V77KY78yGka/R3etsy1kP8VeSvaEZq5flH2iA8jwJds4yn1fZZi3P90xgMjSfJ5iRvuXR14WupdOJAOuMm4zMZ0tkc+wbHOb+/lTec38fKtgiff+wQP39lmPP//Pv8088OAla2T9SubbN7Sw+9rfO4w/PiFfxFFX9bVueZ6rlYqPtWRW2ooIfvvLjp0/mMrnmNp8yEr2375Iu7WXcX3W1xGIXfWNeRr+OuKc+/Ejo97Q/PTqXpSUQI6RrvvGItn3lwLz9/ZQSAXx46w51XbWAqlSVqLuD54j3Ws6w3WVCc7c6jts9iosRfURsibYXfF4qOtfP7vwo9/7N2RkpWj6ADl63v5XE9zl1Xbcg/WVeLvCrBEf+DQ5P279b79e7XracjZiKRfO7RQ+7irpl0jcRf6HNfF1INTiXYaOfibXMeKPFX1IbebXDXj6G/tBJiXZilv0B7LERHLMSnv/8ya7ti7MQkCqzubuVHv3NN0Wsp26cSnJLd+wetXsgd9sUgauq84/I1APx03xCHhidJZ3Oks9ItabwgVNBToiasvBje/SAMXL64250jyvNX1I5Vly5uxBWEGwX6n/JhQ+drf/haYqbB5x87zIy0nt/T7tNZzHktZfsE4vQB2HvKEv9On54NvS0RBseT7uremkT+iy3+QsCaK5bOuV8GJf6K5qCCdQcbexJsX93G0TNTTOYsYe9pby19oq5SPSvBEf+XTxVG/sXPOTtlrfqFBRb/Wq01aRCU+CuagwqtmoHOGMdGpxnPWM9LRH0yTjSV6lkJcVMnGtLZf9qO/H3E36nUecQunxFdUNtH2XNBKPFXNAdO+t2sJaajTKezDE7bD+g+q4ndFb4qogxCCEFPS5hJe0K33aeeT2+rJf6vjljiH2sE22eZoMRf0RxUuO5gwF7FeyblWAY+0b0SlYpxrJ9E2CBslL73vS3WndWrZ6yMoKi5gO9pvSZ8lwlK/BXNQYXrDhzxT8qA6F5TqZ6V4nS66oj7v1fOxeHV4VraPkr8/VDir2gOKvR/nXoySRzx97N9VLZPpTji7pfpA1ZTdiHg1TO1tH2U5++HEn9Fc1ChBRAzDboTJjPYYuVr+ziRvxKV2ehJWLaOX6YPWCWRu+JhjoxYtk9ERf6LhhJ/RXPgCHUFtYZWd8TIiIAm7Srbp2Jmi/zByvhxJoUXNvJXnn8QSvwVzcEcag3tGGins90uSxGU7aNEZVYc8S8X+QNsW9Hi/qw8/8VDvSuK5mAO/u+f3XI+udE/gYMX+RfnUit8K8aN/APE/8YLV/D1Z44DC73Ct0bFBRsEJf6K5mAOto+uCfSuddB1p/8TnGJ1YZ/Vv4oC+tsj6JoIbMxy9ZYe9+ewsYBmhJrwDUSJv6I5WMil/uuvhvc8BD1bqn+tBqe3JcKDH9zNuq7y5Y29k7xiIevhKNsnEPWuKJqDhbQANA0GdlX/Ok2C2wchgMc/8noO2aWfFww14RuIelcUzYESgiXNyrYoK6to2O6Lsn0CUdk+iuZglpLOigZE2T6BqE+CojlQ5X2bDyX+gSjxVzQHygJoPpTVF4gSf0VzUGFJZ0UDoS74gSjxVzQHFZZ0VjQQyuoLRIm/ojmYQ3kHRYOgPP9AlPgrmgNlATQfSvwDUeKvaA7mUN5B0SCo2j6BKPFXNAddm6B1FUQ76j0SxWKhIv9AqhJ/IUSnEOIhIcR++3vJJ0sIsUMI8bgQ4gUhxPNCiN+tZpsKxbzYeC3c86J/lU5FY6LEP5BqI/97gYellJuBh+3fi5kC3iWlvAB4I/C3Qoj2KrerUCgUwagMr0CqFf9bgfvtn+8H3lz8BCnlPinlfvvnE8Ag0FP8PIVCoVhQ1CKvQKoV/z4p5UkA+3tv0JOFELsAE3ilzN/fK4R4Sgjx1NDQUJVDUygUTY3K8Apk1kuiEOKHwAqfP903lw0JIVYCXwRul1Lm/J4jpfws8FmAnTt3yrm8vkKhUBSgIv9AZn1XpJTXl/ubEOK0EGKllPKkLe6DZZ7XCnwX+KiU8hfzHq1CoVBUiprwDaRa2+dbwO32z7cDDxQ/QQhhAt8AviCl/L9Vbk+hUCgqQ4l/INWK/yeBNwgh9gNvsH9HCLFTCPFP9nN+B9gN3CGEeNb+2lHldhUKhSIYtcgrkKouiVLKEeA6n8efAu60f/4S8KVqtqNQKBRzRkX+gagVvgqFojFR4h+IEn+FQtGYqFTPQJT4KxSKxiTWBdf8F9h6c71HsiRR90MKhaIxEQKu+XC9R7FkUZG/QqFQNCFK/BUKhaIJUeKvUCgUTYgSf4VCoWhClPgrFApFE6LEX6FQKJoQJf4KhULRhCjxVygUiiZESLk0e6YIIYaAV6t4iW5geIGGs9Rppn0Ftb+NTDPtK9Rmf9dKKWdtlbtkxb9ahBBPSSl31nsci0Ez7Suo/W1kmmlfob77q2wfhUKhaEKU+CsUCkUT0sji/9l6D2ARaaZ9BbW/jUwz7SvUcX8b1vNXKBQKRXkaOfJXKBQKRRkaTvyFEG8UQuwVQhwQQtxb7/HUAiHEYSHEr4UQzwohnrIf6xRCPCSE2G9/76j3OOeLEOJzQohBIcQez2O++ycs/s4+3s8LIS6t38jnTpl9/bgQ4rh9fJ8VQtzs+dtH7H3dK4S4sT6jnj9CiAEhxI+FEC8JIV4QQnzAfrzhjm/Avi6N4yulbJgvQAdeATYAJvAccH69x1WD/TwMdBc99mngXvvne4FP1XucVezfbuBSYM9s+wfcDHwPEMAVwC/rPf4F2NePA3/q89zz7XM6DKy3z3W93vswx/1dCVxq/9wC7LP3q+GOb8C+Lonj22iR/y7ggJTyoJQyBfwrcGudx7RY3Arcb/98P/DmOo6lKqSUPwXOFD1cbv9uBb4gLX4BtAshVi7OSKunzL6W41bgX6WUSSnlIeAA1jm/bJBSnpRSPm3/PA68BKyiAY9vwL6WY1GPb6OJ/yrgqOf3YwS/2csVCfxACPErIcR77cf6pJQnwTrpgN66ja42lNu/Rj3m77dtjs95LLyG2lchxDrgEuCXNPjxLdpXWALHt9HEX/g81ojpTK+TUl4K3AS8Twixu94DqiONeMz/EdgI7ABOAv/dfrxh9lUIkQD+H/BBKeVY0FN9HltW++yzr0vi+Daa+B8DBjy/rwZO1GksNUNKecL+Pgh8A+vW8LRzO2x/H6zfCGtCuf1ruGMupTwtpcxKKXPA/yZ/698Q+yqECGGJ4b9IKb9uP9yQx9dvX5fK8W008X8S2CyEWC+EMIG3Ad+q85gWFCFEXAjR4vwM3ADswdrP2+2n3Q48UJ8R1oxy+/ct4F12VsgVwDnHPliuFHnat2EdX7D29W1CiLAQYj2wGXhiscdXDUIIAfwf4CUp5d94/tRwx7fcvi6Z41vvGfEazLDfjDWr/gpwX73HU4P924CVEfAc8IKzj0AX8DCw3/7eWe+xVrGPX8G6HU5jRUPvKbd/WLfK/2Af718DO+s9/gXY1y/a+/I8liCs9Dz/Pntf9wI31Xv889jfK7GsjOeBZ+2vmxvx+Abs65I4vmqFr0KhUDQhjWb7KBQKhaIClPgrFApFE6LEX6FQKJoQJf4KhULRhCjxVygUiiZEib9CoVA0IUr8FQqFoglR4q9QKBRNyP8HvJ3mU4SsVqcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(outNoise_ph[0,:])\n",
    "plt.plot(outEst_noise_ph[0,:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "W1217 21:48:58.567184 140233784268608 deprecation.py:323] From /home/rasmus/.conda/envs/claudeOnline/lib/python3.6/site-packages/tensorflow/python/training/saver.py:1276: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n"
     ]
    }
   ],
   "source": [
    "saver.restore(sess=sess,save_path=checkpoint_path)\n",
    "[outEnc, outChannel_out, outChannel_ph] = sess.run([enc,channel_out,channel_ph], feed_dict=feedDict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-1.5, 1.5)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "lim_ = 1.5\n",
    "plt.plot(np.real(outEnc[0,:]), np.imag(outEnc[0,:]),'.')\n",
    "plt.axis('square');\n",
    "plt.xlim(-lim_,lim_)\n",
    "plt.ylim(-lim_,lim_)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
